home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 January: Mac OS SDK / Dev.CD Jan 97 SDK1.toast / Development Kits (Disc 1) / QuickDraw 3D / Development / 3DMF parser / 0.9 version / MFOBJECT.C < prev    next >
Encoding:
C/C++ Source or Header  |  1996-05-21  |  215.3 KB  |  8,808 lines  |  [TEXT/MPS ]

  1. /*==============================================================================
  2.  *
  3.  *    File:        MFOBJECT.C
  4.  *
  5.  *    Function:    Object read/write
  6.  *
  7.  *    Author(s):    Rick Wong (RWW), Duet Development Corp.
  8.  *
  9.  *    Copyright:    (c) 1995 by Apple Computer, Inc., all rights reserved.
  10.  *
  11.  *    Change History (most recent first):
  12.  *        Fabio    Changed file name to 8 characters
  13.  *        F3K_RWW    GeneralPolygonHint.
  14.  *        F3G_RWW    User-defined objects.
  15.  *        F3A_RWW    MeshEdges and OrientationStyle.
  16.  *        F2S_RWW    BeginGroup changes.
  17.  *        F2R_RWW    Change to simple object theory.
  18.  *        F2H_RWW    File created.
  19.  *==============================================================================
  20.  */
  21.  
  22. #include "MFOBJECT.H"
  23.  
  24. #include <string.h>            /* memcpy */
  25.  
  26. #include "MF3D.H"
  27. #include "MFERRORS.H"
  28. #include "MFINT64.H"
  29. #include "MFOBJCTS.H"
  30. #include "MFASSERT.H"
  31. #include "MFGROUPS.H"
  32. #include "MFINTOBJ.H"
  33. #include "MFMACROS.H"
  34. #include "MFMEMORY.H"
  35. #include "MFOBJTYP.H"
  36. #include "MFPRIMTV.H"
  37. #include "MFRSLNTN.H"
  38. #include "MFTEXTST.H"
  39. #include "MFTEXTWR.H"    /* MF3D_WriteNewLine */
  40.  
  41. /*==============================================================================
  42.  *    MF3D_VerifyObject
  43.  *==============================================================================
  44.  */
  45. #define    MF3D_VerifyObjectType(inObj, inObjType)                                \
  46.     MFASSERT(inObj != NULL && inObj->objectType == inObjType);
  47.  
  48. #if defined(__COMPILING_ON_MACINTOSH__)
  49. #pragma segment __OBJECTS_1__
  50. #endif
  51.  
  52. /*==============================================================================
  53.  *    MF3D_IntReadObject
  54.  *
  55.  *    Moved out of ReadAnObject to support BeginGroup()
  56.  *
  57.  *    Sets *outMF3DObjPtr to NULL on failure.
  58.  *==============================================================================
  59.  */
  60. MF3DErr
  61. MF3D_IntReadObject(
  62.     MF3D_FilePtr    inMF3DFilePtr,        /* In:  MF3D file structure            */
  63.     MF3DVoidObjPtr    *outMF3DObjPtr)        /* Out: metafile object                */
  64. {
  65.     MF3DObjType                objType;
  66.     MF3D_ObjStuffPtr        objStuff;
  67.     MF3DReferenceID            objRefID;
  68.     MF3DVoidObjPtr            object;
  69.     MF3DBoolean                objTypeIsValid;
  70.     MF3DErr                    result;
  71.  
  72.     objTypeIsValid = kMF3DBooleanFalse;
  73.     result = MF3D_BeginRead(inMF3DFilePtr, &objStuff, &objRefID, &objType);
  74.  
  75.     if (result == kMF3DNoErr)
  76.     {    objTypeIsValid = kMF3DBooleanTrue;
  77.         result = (*objStuff->reader) (inMF3DFilePtr, &object);
  78.     }
  79.  
  80.     /* Special setup for User-created objects */
  81.     if (result == kMF3DNoErr && objStuff->type == kMF3DObjUnknownType)
  82.     {    ((MF3DUnknownObjPtr)object)->realObjectType = objType;
  83.         result = MF3D_ConvertUserDefinedObjType(inMF3DFilePtr, objType,
  84.             &(((MF3DUnknownObjPtr)object)->realObjectName));
  85.         objType = kMF3DObjUnknownType;
  86.     }
  87.  
  88.     if (result == kMF3DNoErr && object != NULL)
  89.     {    object->objectType = objType;
  90.         if (objRefID != 0 && objType != kMF3DObjTableOfContents)
  91.         {    MF3D_Allocate(object->refInfo);
  92.             if (result == kMF3DNoErr)
  93.             {    object->refInfo->refID = objRefID;
  94.                 object->refInfo->refName = MF3D_GetRefName(
  95.                         inMF3DFilePtr, objRefID);
  96.             }
  97.         }
  98.         else
  99.             object->refInfo = NULL;
  100.     }
  101.  
  102.     /*
  103.      * The only excuse for this small series of special-case tests
  104.      * is that we cannot seem to think of a reasonable alternative
  105.      * at the moment. One option that would alleviate the IsTextFormat
  106.      * test is to read binary files in smaller chunks (like we read
  107.      * the text files), but since that is not a trivial change and
  108.      * would slow the speed of reading binary files, we opt not to
  109.      * do that for now.
  110.      */
  111.     if (result == kMF3DNoErr)
  112.     {    if (objType != kMF3DObjContainer)
  113.         {    result = MF3D_EndRead(inMF3DFilePtr);
  114.         }
  115.         else if (MF3DIsTextFormat(inMF3DFilePtr->dataFormat))
  116.         {    /* After reading a text container, we still have to dispose
  117.              * of the readBuffer.
  118.              */
  119.             /* We should be the end of the object, free the buffer */
  120.             MFASSERT(inMF3DFilePtr->readBuffer.buf[
  121.                     inMF3DFilePtr->readBuffer.bufPos] == '\0');
  122.             MFASSERT(inMF3DFilePtr->readBuffer.bufPos ==
  123.                     inMF3DFilePtr->readBuffer.bufSize);
  124.             MF3D_Free(inMF3DFilePtr->readBuffer.buf);
  125.             inMF3DFilePtr->readBuffer.buf = NULL;
  126.         }
  127.     }
  128.  
  129.     /*
  130.      * If we did get an error, skip the current object by clearing the
  131.      * read buffer.
  132.      */
  133.     if (result != kMF3DNoErr)
  134.     {    MF3D_Free(inMF3DFilePtr->readBuffer.buf);
  135.             inMF3DFilePtr->readBuffer.buf = NULL;
  136.     }    
  137.  
  138.     /* Note that we do this anyway in the error case */
  139.     if ((objTypeIsValid == kMF3DBooleanTrue || result == kMF3DNoMoreObjects) &&
  140.             inMF3DFilePtr->resStuff.resState >= MF3D_ResolvingReference)
  141.     {    if (objTypeIsValid == kMF3DBooleanTrue)
  142.         {    switch (objType)
  143.             {    case kMF3DObjBeginGroup:
  144.                 case kMF3DObjContainer:
  145.                     ++inMF3DFilePtr->resStuff.resState;
  146.                     break;
  147.                 case kMF3DObjEndGroup:
  148.                 case kMF3DObjEndContainer:    /* Actually, we will not get this */
  149.                     --inMF3DFilePtr->resStuff.resState;
  150.                     break;
  151.             }
  152.         }
  153.         if (result == kMF3DNoMoreObjects ||
  154.                 inMF3DFilePtr->resStuff.resState == MF3D_ResolvingReference)
  155.         {    MFASSERT(inMF3DFilePtr->resStuff.resState >=
  156.                     MF3D_ResolvingReference);
  157.             /* Reset back to original file pointer */
  158.             result = MF3D_PopResolution(inMF3DFilePtr);
  159.         }
  160.     }
  161.  
  162.     if (result == kMF3DNoErr)
  163.         *outMF3DObjPtr = object;
  164.     else
  165.         *outMF3DObjPtr = NULL;
  166.  
  167.     return result;
  168. }
  169.  
  170. /*==============================================================================
  171.  *    MF3D_ObjMetafileReader
  172.  *==============================================================================
  173.  */
  174. MF3DErr
  175. MF3D_ObjMetafileReader(
  176.     MF3D_FilePtr    inMetafilePtr,
  177.     MF3DVoidObjPtr    *outObj)
  178. {
  179.     MF3DMetafileObjPtr        returnObj;
  180.     MF3DErr                    result;
  181.  
  182.     result = kMF3DNoErr;
  183.  
  184.     MF3D_Allocate(returnObj);
  185.  
  186.     if (result == kMF3DNoErr)
  187.     {    returnObj->dataFormat = inMetafilePtr->dataFormat;
  188.         result = MF3D_Uns16Read(inMetafilePtr, &returnObj->majorVersion);
  189.     }
  190.  
  191.     if (result == kMF3DNoErr)
  192.         result = MF3D_Uns16Read(inMetafilePtr, &returnObj->minorVersion);
  193.  
  194.     if (result == kMF3DNoErr)
  195.     {    result = MF3D_FlagsRead(inMetafilePtr, gMF3D_MetafileFlags,
  196.                 &returnObj->flags);
  197.     }
  198.  
  199.     /* Read the TOC ptr */
  200.     if (result == kMF3DNoErr)
  201.         MF3D_Allocate(returnObj->tocLocation);
  202.  
  203.     if (result == kMF3DNoErr)
  204.         result = MF3D_RefRead(inMetafilePtr, returnObj->tocLocation);
  205.  
  206.     if (result == kMF3DNoErr)
  207.     {    /* As read from the Tables of Contents */
  208.         returnObj->refSeed = inMetafilePtr->tocStuff.refSeed;
  209.         returnObj->typeSeed = inMetafilePtr->tocStuff.typeSeed;
  210.     }
  211.  
  212.     if (result == kMF3DNoErr)
  213.         *outObj = (MF3DVoidObjPtr) returnObj;
  214.     else
  215.         MF3D_Free(returnObj);
  216.  
  217.     /* Check for valid version? */
  218.     if (returnObj->majorVersion > kMF3DVersionMajor ||
  219.             (returnObj->majorVersion == kMF3DVersionMajor &&
  220.              returnObj->minorVersion > kMF3DVersionMinor))
  221.     {    result = kMF3DWarnNewerMetafileFormat;
  222.     }
  223.  
  224.     return result;
  225. }
  226.  
  227. /*==============================================================================
  228.  *    MF3D_ObjMetafileWriter
  229.  *==============================================================================
  230.  */
  231. MF3DErr
  232. MF3D_ObjMetafileWriter(
  233.     MF3D_FilePtr    inMetafilePtr,
  234.     MF3DVoidObjPtr    inObj)
  235. {
  236.     MF3DMetafileObjPtr    writeObj;
  237.     MF3DErr                result;
  238.  
  239.     result = kMF3DNoErr;
  240.  
  241.     MF3D_VerifyObjectType(inObj, kMF3DObjMetafile);
  242.     writeObj = (MF3DMetafileObjPtr)inObj;
  243.  
  244.     if (writeObj->refSeed > inMetafilePtr->tocStuff.refSeed)
  245.     {    if (writeObj->refSeed > kMF3DMaximumRefSeed)
  246.             result = kMF3DErrIllegalRefID;
  247.         inMetafilePtr->tocStuff.refSeed = writeObj->refSeed;
  248.     }
  249.  
  250.     if (writeObj->typeSeed < inMetafilePtr->tocStuff.typeSeed)
  251.     {    if (writeObj->typeSeed < kMF3DMinimumTypeSeed)
  252.             result = kMF3DErrIllegalUserObjectType;
  253.         inMetafilePtr->tocStuff.typeSeed = writeObj->typeSeed;
  254.     }
  255.  
  256.     if (result == kMF3DNoErr)
  257.         result = MF3D_Uns16Write(inMetafilePtr, kMF3DVersionMajor);
  258.  
  259.     if (result == kMF3DNoErr)
  260.         result = MF3D_Uns16Write(inMetafilePtr, kMF3DVersionMinor);
  261.  
  262.     if (result == kMF3DNoErr)
  263.     {    result = MF3D_FlagsWrite(inMetafilePtr, gMF3D_MetafileFlags,
  264.                 ((MF3DMetafileObjPtr)inObj)->flags);
  265.     }
  266.  
  267.     if (result == kMF3DNoErr)
  268.     {    result = MF3D_TOCRefWrite(inMetafilePtr,
  269.                 ((MF3DMetafileObjPtr)inObj)->tocLocation);
  270.     }
  271.  
  272.     return result;
  273. }
  274.  
  275. /*==============================================================================
  276.  *    MF3D_ObjMetafileDisposer
  277.  *==============================================================================
  278.  */
  279. MF3DErr
  280. MF3D_ObjMetafileDisposer(
  281.     MF3DVoidObjPtr    inObj)
  282. {
  283.     MF3DErr    result;
  284.  
  285.     result = kMF3DNoErr;
  286.  
  287.     MF3D_VerifyObjectType(inObj, kMF3DObjMetafile);
  288.  
  289.     if (inObj != NULL)
  290.     {    result = MF3D_PositionReferenceDisposer(
  291.                 ((MF3DMetafileObjPtr)inObj)->tocLocation);
  292.         MF3D_Free(((MF3DMetafileObjPtr)inObj)->tocLocation);
  293.         MF3D_Free(inObj);
  294.     }
  295.     return result;
  296. }
  297.  
  298. /*==============================================================================
  299.  *    MF3D_ObjContainerReader
  300.  *==============================================================================
  301.  */
  302. MF3DErr
  303. MF3D_ObjContainerReader(
  304.     MF3D_FilePtr    inMetafilePtr,
  305.     MF3DVoidObjPtr    *outObj)
  306. {
  307.     MF3DContainerObjPtr        containerObj;
  308.     MF3DErr                    result;
  309.  
  310.     result = kMF3DNoErr;
  311.  
  312.     MF3D_Allocate(containerObj);
  313.  
  314.     if (result == kMF3DNoErr)
  315.     {    ++inMetafilePtr->inContainer;
  316.         *outObj = (MF3DVoidObjPtr) containerObj;
  317.     }
  318.  
  319.     return result;
  320. }
  321.  
  322. /*==============================================================================
  323.  *    MF3D_ObjContainerWriter
  324.  *==============================================================================
  325.  */
  326. MF3DErr
  327. MF3D_ObjContainerWriter(
  328.     MF3D_FilePtr    inMetafilePtr,
  329.     MF3DVoidObjPtr    inObj)
  330. {
  331.     MF3D_VerifyObjectType(inObj, kMF3DObjContainer);
  332.  
  333.     MF3D_Unused(inMetafilePtr);
  334.     MF3D_Unused(inObj);
  335.     /* Nothing to write! */
  336.     return kMF3DNoErr;
  337. }
  338.  
  339. /*==============================================================================
  340.  *    MF3D_ObjContainerDisposer
  341.  *==============================================================================
  342.  */
  343. MF3DErr
  344. MF3D_ObjContainerDisposer(
  345.     MF3DVoidObjPtr    inObj)
  346. {
  347.     MF3D_VerifyObjectType(inObj, kMF3DObjContainer);
  348.  
  349.     MF3D_Free(inObj);
  350.     return kMF3DNoErr;
  351. }
  352.  
  353. /*==============================================================================
  354.  *    MF3D_ObjEndContainerWriter
  355.  *==============================================================================
  356.  */
  357. MF3DErr
  358. MF3D_ObjEndContainerWriter(
  359.     MF3D_FilePtr    inMetafilePtr,
  360.     MF3DVoidObjPtr    inObj)
  361. {
  362.     MF3D_VerifyObjectType(inObj, kMF3DObjEndContainer);
  363.     MF3D_Unused(inMetafilePtr);
  364.     MF3D_Unused(inObj);
  365.     /* Nothing to write! */
  366.     return kMF3DNoErr;
  367. }
  368.  
  369. /*==============================================================================
  370.  *    MF3D_ObjEndContainerDisposer
  371.  *==============================================================================
  372.  */
  373. MF3DErr
  374. MF3D_ObjEndContainerDisposer(
  375.     MF3DVoidObjPtr    inObj)
  376. {
  377.     MF3D_VerifyObjectType(inObj, kMF3DObjEndContainer);
  378.  
  379.     MF3D_Free(inObj);
  380.     return kMF3DNoErr;
  381. }
  382.  
  383. /*==============================================================================
  384.  *    MF3D_ObjBeginGroupReader
  385.  *==============================================================================
  386.  */
  387. MF3DErr
  388. MF3D_ObjBeginGroupReader(
  389.     MF3D_FilePtr    inMetafilePtr,
  390.     MF3DVoidObjPtr    *outObj)
  391. {
  392.     MF3DBeginGroupObjPtr        returnObj;
  393.     MF3DErr                        result, dispResult;
  394.  
  395.     result = kMF3DNoErr;
  396.  
  397.     MF3D_Allocate(returnObj);
  398.  
  399.     if (result == kMF3DNoErr)
  400.     {    returnObj->group = NULL;
  401.         returnObj->displayState = NULL;
  402.         result = MF3D_IntReadObject(inMetafilePtr, &returnObj->group);
  403.     }
  404.  
  405.     /* Optional display state */
  406.     if (result == kMF3DNoErr)
  407.     {    dispResult = MF3D_IntReadObject(inMetafilePtr,
  408.                 (MF3DVoidObjPtr *)&returnObj->displayState);
  409.         if (dispResult == kMF3DNoErr &&
  410.                 returnObj->displayState->objectType !=
  411.                 kMF3DObjDisplayGroupState)
  412.         {    result = kMF3DErrWrongObjType;
  413.         }
  414.         if (dispResult != kMF3DErrCantParse)
  415.             result = dispResult;
  416.     }
  417.  
  418.     if (result == kMF3DNoErr)
  419.         result = MF3D_PushGroup(inMetafilePtr);
  420.  
  421.     if (result == kMF3DNoErr)
  422.         *outObj = (MF3DVoidObjPtr) returnObj;
  423.     else
  424.         MF3D_Free(returnObj);
  425.  
  426.     return result;
  427. }
  428.  
  429. /*==============================================================================
  430.  *    MF3D_ObjBeginGroupWriter
  431.  *==============================================================================
  432.  */
  433. MF3DErr
  434. MF3D_ObjBeginGroupWriter(
  435.     MF3D_FilePtr    inMetafilePtr,
  436.     MF3DVoidObjPtr    inObj)
  437. {
  438.     MF3DBeginGroupObjPtr    beginGroupObj;
  439.     MF3DErr                    result;
  440.  
  441.     MF3D_VerifyObjectType(inObj, kMF3DObjBeginGroup);
  442.     beginGroupObj = (MF3DBeginGroupObjPtr)inObj;
  443.  
  444.     if (beginGroupObj->group == NULL)
  445.         return kMF3DErrGroupTypeNotSpecified;
  446.  
  447.     MF3D_WriteNewLine(inMetafilePtr);
  448.     result = MF3DWriteAnObject(inMetafilePtr, beginGroupObj->group);
  449.  
  450.     if (result == kMF3DNoErr && beginGroupObj->displayState != NULL)
  451.     {    result = MF3DWriteAnObject(inMetafilePtr,
  452.                 (MF3DVoidObjPtr)beginGroupObj->displayState);
  453.     }
  454.  
  455.     return result;
  456. }
  457.  
  458. /*==============================================================================
  459.  *    MF3D_ObjBeginGroupDisposer
  460.  *==============================================================================
  461.  */
  462. MF3DErr
  463. MF3D_ObjBeginGroupDisposer(
  464.     MF3DVoidObjPtr    inObj)
  465. {
  466.     MF3D_VerifyObjectType(inObj, kMF3DObjBeginGroup);
  467.  
  468.     if (inObj != NULL)
  469.     {    MF3DDisposeObject(((MF3DBeginGroupObjPtr)inObj)->group);
  470.         MF3DDisposeObject((MF3DVoidObjPtr)
  471.                 ((MF3DBeginGroupObjPtr)inObj)->displayState);
  472.         MF3D_Free(inObj);
  473.     }
  474.     return kMF3DNoErr;
  475. }
  476.  
  477. /*==============================================================================
  478.  *    MF3D_ObjEndGroupReader
  479.  *==============================================================================
  480.  */
  481. MF3DErr
  482. MF3D_ObjEndGroupReader(
  483.     MF3D_FilePtr    inMetafilePtr,
  484.     MF3DVoidObjPtr    *outObj)
  485. {
  486.     MF3DEndGroupObjPtr            returnObj;
  487.     MF3DErr                        result;
  488.  
  489.     result = kMF3DNoErr;
  490.  
  491.     MF3D_Allocate(returnObj);
  492.  
  493.     if (result == kMF3DNoErr)
  494.     {    /* Do any necessary end group processing */
  495.         result = MF3D_PopGroup(inMetafilePtr);
  496.     }
  497.  
  498.     if (result == kMF3DNoErr)
  499.         *outObj = (MF3DVoidObjPtr) returnObj;
  500.     else
  501.         MF3D_Free(returnObj);
  502.  
  503.     return result;
  504. }
  505.  
  506. /*==============================================================================
  507.  *    MF3D_ObjEndGroupWriter
  508.  *==============================================================================
  509.  */
  510. MF3DErr
  511. MF3D_ObjEndGroupWriter(
  512.     MF3D_FilePtr    inMetafilePtr,
  513.     MF3DVoidObjPtr    inObj)
  514. {
  515.     MF3D_VerifyObjectType(inObj, kMF3DObjEndGroup);
  516.     MF3D_Unused(inMetafilePtr);
  517.     MF3D_Unused(inObj);
  518.     /* Nothing to write! */
  519.     return kMF3DNoErr;
  520. }
  521.  
  522. /*==============================================================================
  523.  *    MF3D_ObjEndGroupDisposer
  524.  *==============================================================================
  525.  */
  526. MF3DErr
  527. MF3D_ObjEndGroupDisposer(
  528.     MF3DVoidObjPtr    inObj)
  529. {
  530.     MF3D_VerifyObjectType(inObj, kMF3DObjEndGroup);
  531.  
  532.     MF3D_Free(inObj);
  533.     return kMF3DNoErr;
  534. }
  535.  
  536. /*==============================================================================
  537.  *    MF3D_ObjReferenceReader
  538.  *==============================================================================
  539.  */
  540. MF3DErr
  541. MF3D_ObjReferenceReader(
  542.     MF3D_FilePtr    inMetafilePtr,
  543.     MF3DVoidObjPtr    *outObj)
  544. {
  545.     MF3DReferenceObjPtr            returnObj;
  546.     MF3DErr                        result;
  547.  
  548.     result = kMF3DNoErr;
  549.  
  550.     MF3D_Allocate(returnObj);
  551.  
  552.     if (result == kMF3DNoErr)
  553.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->refID);
  554.  
  555.     if (result == kMF3DNoErr)
  556.         *outObj = (MF3DVoidObjPtr) returnObj;
  557.     else
  558.         MF3D_Free(returnObj);
  559.  
  560.     return result;
  561. }
  562.  
  563. /*==============================================================================
  564.  *    MF3D_ObjReferenceWriter
  565.  *==============================================================================
  566.  */
  567. MF3DErr
  568. MF3D_ObjReferenceWriter(
  569.     MF3D_FilePtr    inMetafilePtr,
  570.     MF3DVoidObjPtr    inObj)
  571. {
  572.     MF3D_VerifyObjectType(inObj, kMF3DObjReference);
  573.  
  574.     return MF3D_Uns32Write(inMetafilePtr, ((MF3DReferenceObjPtr)inObj)->refID);
  575. }
  576.  
  577. /*==============================================================================
  578.  *    MF3D_ObjReferenceDisposer
  579.  *==============================================================================
  580.  */
  581. MF3DErr
  582. MF3D_ObjReferenceDisposer(
  583.     MF3DVoidObjPtr    inObj)
  584. {
  585.     MF3D_VerifyObjectType(inObj, kMF3DObjReference);
  586.  
  587.     MF3D_Free(inObj);
  588.  
  589.     return kMF3DNoErr;
  590. }
  591.  
  592. /*==============================================================================
  593.  *    MF3D_ObjTableOfContentsReader
  594.  *==============================================================================
  595.  */
  596. MF3DErr
  597. MF3D_ObjTableOfContentsReader(
  598.     MF3D_FilePtr    inMetafilePtr,
  599.     MF3DVoidObjPtr    *outObj)
  600. {
  601.     MF3DTableOfContentsObjPtr    returnObj;
  602.     MF3DErr                        result;
  603.  
  604.     result = kMF3DNoErr;
  605.  
  606.     MF3D_Allocate(returnObj);
  607.  
  608.     if (result == kMF3DNoErr)
  609.         MF3D_Allocate(returnObj->nextTOC);
  610.  
  611.     if (result == kMF3DNoErr)
  612.         result = MF3D_RefRead(inMetafilePtr, returnObj->nextTOC);
  613.  
  614.     if (result == kMF3DNoErr)
  615.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->refSeed);
  616.  
  617.     if (result == kMF3DNoErr)
  618.         result = MF3D_Int32Read(inMetafilePtr, &returnObj->typeSeed);
  619.  
  620.     if (result == kMF3DNoErr)
  621.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->tocEntryType);
  622.  
  623.     if (result == kMF3DNoErr)
  624.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->tocEntrySize);
  625.  
  626.     if (result == kMF3DNoErr)
  627.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->nEntries);
  628.  
  629.     if (result == kMF3DNoErr)
  630.     {    MF3DUns32    entriesLeft;
  631.  
  632.         entriesLeft = returnObj->nEntries;
  633.         if (entriesLeft == 0)
  634.         {    returnObj->tocEntries = NULL;
  635.         }
  636.         else
  637.         {    MF3D_TOCEntryPtr    curEntryPtr;
  638.  
  639.             returnObj->tocEntries = MF3D_Malloc(entriesLeft *
  640.                     sizeof(*returnObj->tocEntries));
  641.             if (returnObj->tocEntries == NULL)
  642.                 result = kMF3DErrOutOfMemory;
  643.  
  644.             curEntryPtr = returnObj->tocEntries;
  645.             while (result == kMF3DNoErr && entriesLeft > 0)
  646.             {    result = MF3D_Uns32Read(inMetafilePtr, &curEntryPtr->refID);
  647.  
  648.                 if (curEntryPtr->refID >= returnObj->refSeed)
  649.                     result = kMF3DErrIllegalRefID;
  650.  
  651.                 if (result == kMF3DNoErr)
  652.                     MF3D_Allocate(curEntryPtr->objLocation);
  653.  
  654.                 if (result == kMF3DNoErr)
  655.                 {    result = MF3D_RefRead(inMetafilePtr,
  656.                             curEntryPtr->objLocation);
  657.                 }
  658.  
  659.                 if (result == kMF3DNoErr)
  660.                 {    if (returnObj->tocEntryType >= 1)
  661.                     {    result = MF3D_ObjTypeRead(inMetafilePtr, NULL,
  662.                                 &curEntryPtr->objType);
  663.                     }
  664.                     else
  665.                     {    /* Not necessary, but looks better */
  666.                         curEntryPtr->objType = 0L;
  667.                     }
  668.                 }
  669.  
  670.                 --entriesLeft;
  671.                 ++curEntryPtr;
  672.             }
  673.  
  674.             if (result != kMF3DNoErr)
  675.             {    MF3D_Free(returnObj->tocEntries);
  676.             }
  677.         }
  678.     }
  679.  
  680.     if (result == kMF3DNoErr)
  681.         *outObj = (MF3DVoidObjPtr) returnObj;
  682.     else
  683.         MF3D_Free(returnObj);
  684.  
  685.     return result;
  686. }
  687.  
  688. /*==============================================================================
  689.  *    MF3D_ObjTableOfContentsWriter
  690.  *
  691.  *    Called only from MF3DClose when writing.
  692.  *==============================================================================
  693.  */
  694. MF3DErr
  695. MF3D_ObjTableOfContentsWriter(
  696.     MF3D_FilePtr    inMetafilePtr,
  697.     MF3DVoidObjPtr    inObj)
  698. {
  699.     MF3DUns32    entriesLeft;
  700.     MF3DErr        result;
  701.  
  702.     MF3D_Unused(inObj);
  703.  
  704.     result = kMF3DNoErr;
  705.  
  706.     MF3D_WriteNewLine(inMetafilePtr);
  707.  
  708.     /* NOTE: This will always write 0 in the binary case and
  709.      * nextTOC> in the text case. In the binary case, we will
  710.      * also trash inMetafilePtr->tocLocation, but we no longer
  711.      * need it because we have already backpatched the header.
  712.      * It also has the side effect of allocating a string that
  713.      * gets placed into inMetafilePtr->tocStuff.tocLabelName.
  714.      */
  715.     result = MF3D_TOCRefWrite(inMetafilePtr, NULL);
  716.  
  717.     MF3D_Free(inMetafilePtr->tocStuff.tocLabelName);
  718.     inMetafilePtr->tocStuff.tocLabelName = NULL;
  719.  
  720.     if (result == kMF3DNoErr)
  721.     {    MF3D_WriteNewLine(inMetafilePtr);
  722.         result = MF3D_Uns32Write(inMetafilePtr,
  723.                 inMetafilePtr->tocStuff.refSeed);
  724.     }
  725.  
  726.     if (result == kMF3DNoErr)
  727.         MF3D_CommentStrWrite(inMetafilePtr, "reference Seed");
  728.  
  729.     if (result == kMF3DNoErr)
  730.     {    result = MF3D_Int32Write(inMetafilePtr,
  731.                 inMetafilePtr->tocStuff.typeSeed);
  732.     }
  733.  
  734.     if (result == kMF3DNoErr)
  735.         MF3D_CommentStrWrite(inMetafilePtr, "type Seed");
  736.  
  737.     if (result == kMF3DNoErr)
  738.         result = MF3D_Uns32Write(inMetafilePtr, kMF3DTocEntryType);
  739.  
  740.     if (result == kMF3DNoErr)
  741.         result = MF3D_Uns32Write(inMetafilePtr, kMF3DTocEntrySize);
  742.  
  743.     if (result == kMF3DNoErr)
  744.         MF3D_CommentStrWrite(inMetafilePtr, "tocEntry type/size");
  745.  
  746.     if (result == kMF3DNoErr)
  747.     {    entriesLeft = inMetafilePtr->tocStuff.numReferences;
  748.         result = MF3D_Uns32Write(inMetafilePtr, entriesLeft);
  749.     }
  750.  
  751.     if (result == kMF3DNoErr)
  752.         MF3D_CommentStrWrite(inMetafilePtr, "nEntries");
  753.  
  754.     if (result == kMF3DNoErr)
  755.     {    MF3D_TOCReferencePtr    curRefPtr;
  756.  
  757.         curRefPtr = inMetafilePtr->tocStuff.references;
  758.         MFASSERT(curRefPtr != NULL || entriesLeft == 0);
  759.  
  760.         for ( ; result == kMF3DNoErr && entriesLeft > 0;
  761.                 --entriesLeft, ++curRefPtr)
  762.         {    MF3D_ObjStuffPtr    ignoredObjStuff;
  763.             MF3DVoidObj            fakeObj;
  764.  
  765.             result = MF3D_Uns32Write(inMetafilePtr, curRefPtr->refID);
  766.  
  767.             if (result == kMF3DNoErr)
  768.                 result = MF3D_RefWrite(inMetafilePtr, curRefPtr->ref);
  769.  
  770.             if (result == kMF3DNoErr)
  771.             {    /* Fake an object to write the type */
  772.                 MFASSERT((MF3DInt32)curRefPtr->type > 0);
  773.                 fakeObj.objectType = curRefPtr->type;
  774.                 result = MF3D_ObjTypeWrite(inMetafilePtr, &fakeObj,
  775.                         &ignoredObjStuff);
  776.             }
  777.  
  778.             if (result == kMF3DNoErr)
  779.                 MF3D_WriteNewLine(inMetafilePtr);
  780.         }
  781.     }
  782.  
  783.     return result;
  784. }
  785.  
  786. /*==============================================================================
  787.  *    MF3D_ObjTableOfContentsDisposer
  788.  *==============================================================================
  789.  */
  790. MF3DErr
  791. MF3D_ObjTableOfContentsDisposer(
  792.     MF3DVoidObjPtr    inObj)
  793. {
  794.     MF3DTableOfContentsObjPtr    tocObj;
  795.     MF3DErr                        result;
  796.  
  797.     MF3D_VerifyObjectType(inObj, kMF3DObjTableOfContents);
  798.  
  799.     result = kMF3DNoErr;
  800.  
  801.     tocObj = (MF3DTableOfContentsObjPtr) inObj;
  802.  
  803.     if (tocObj != NULL)
  804.     {    MF3DUns32    entriesLeft;
  805.  
  806.         result = MF3D_PositionReferenceDisposer(tocObj->nextTOC);
  807.  
  808.         if (result == kMF3DNoErr)
  809.         {    MF3D_TOCEntryPtr    curEntryPtr;
  810.  
  811.             curEntryPtr = tocObj->tocEntries;
  812.             for (entriesLeft = tocObj->nEntries; entriesLeft > 0; --entriesLeft)
  813.             {    MF3D_PositionReferenceDisposer(curEntryPtr->objLocation);
  814.                 MF3D_Free(curEntryPtr->objLocation);
  815.                 ++curEntryPtr;
  816.             }
  817.  
  818.             MF3D_Free(tocObj->nextTOC);
  819.             MF3D_Free(tocObj->tocEntries);
  820.             MF3D_Free(tocObj);
  821.         }
  822.     }
  823.  
  824.     return result;
  825. }
  826.  
  827. /*==============================================================================
  828.  *    MF3D_ObjTypeReader
  829.  *==============================================================================
  830.  */
  831. MF3DErr
  832. MF3D_ObjTypeReader(
  833.     MF3D_FilePtr    inMetafilePtr,
  834.     MF3DVoidObjPtr    *outObj)
  835. {
  836.     MF3DInt32            typeID;                /* always negative                */
  837.     MF3DCStringPtr        owner;                /* ISO 9070-registered ID        */
  838.     MF3DErr                result;
  839.  
  840.     result = MF3D_Int32Read(inMetafilePtr, &typeID);
  841.  
  842.     if (result == kMF3DNoErr && typeID >= 0)
  843.         result = kMF3DErrIllegalUserObjectType;
  844.  
  845.     if (result == kMF3DNoErr)
  846.         result = MF3D_CStringRead(inMetafilePtr, &owner);
  847.  
  848.     /* Make sure that the type number is not already taken */
  849.     if (result == kMF3DNoErr)
  850.     {    MF3DUns32            numTypes;
  851.         MF3D_TypeListPtr    typeListPtr;
  852.  
  853.         typeListPtr = inMetafilePtr->typeTable.types;
  854.         for (numTypes = inMetafilePtr->typeTable.nTypes;
  855.                 result == kMF3DNoErr && numTypes > 0;
  856.                 --numTypes, ++typeListPtr)
  857.         {    if (typeID == typeListPtr->number)
  858.                 result = kMF3DErrIllegalUserObjectType;
  859.         }
  860.     }
  861.  
  862.     /* Add it to our table */
  863.     if (result == kMF3DNoErr)
  864.     {    MF3D_TypeListPtr    tempPtr;
  865.         MF3DUns32            numTypes;
  866.  
  867.         ++inMetafilePtr->typeTable.nTypes;
  868.         numTypes = inMetafilePtr->typeTable.nTypes;
  869.  
  870.         tempPtr = MF3D_Realloc(inMetafilePtr->typeTable.types,
  871.                     numTypes * sizeof(*inMetafilePtr->typeTable.types));
  872.  
  873.         if (tempPtr == NULL)
  874.             result = kMF3DErrOutOfMemory;
  875.         else
  876.         {    inMetafilePtr->typeTable.types = tempPtr;
  877.             inMetafilePtr->typeTable.types[numTypes - 1].number = typeID;
  878.             inMetafilePtr->typeTable.types[numTypes - 1].name = owner;
  879.  
  880.             if (typeID < inMetafilePtr->tocStuff.typeSeed)
  881.                 inMetafilePtr->tocStuff.typeSeed = typeID - 1;
  882.         }
  883.     }
  884.  
  885.     /* Force reader to read again */
  886.     *outObj = NULL;
  887.  
  888.     return result;
  889. }
  890.  
  891. /*==============================================================================
  892.  *    MF3D_ObjTypeWriter
  893.  *
  894.  *    Supposed to be called only by MF3D_TypeObjWrite with inObj being of type
  895.  *    kMF3DObjUnknownType
  896.  *==============================================================================
  897.  */
  898. MF3DErr
  899. MF3D_ObjTypeWriter(
  900.     MF3D_FilePtr    inMetafilePtr,
  901.     MF3DVoidObjPtr    inObj)
  902. {
  903.     MF3DUnknownObjPtr    writeObj;
  904.     MF3DErr                result;
  905.  
  906.     MF3D_VerifyObjectType(inObj, kMF3DObjUnknownType);
  907.     writeObj = (MF3DUnknownObjPtr)inObj;
  908.  
  909.     MFASSERT(sizeof(writeObj->realObjectType) == sizeof(MF3DInt32));
  910.     result = MF3D_Int32Write(inMetafilePtr,
  911.             (MF3DInt32)writeObj->realObjectType);
  912.  
  913.     if (result == kMF3DNoErr)
  914.         result = MF3D_CStringWrite(inMetafilePtr, writeObj->realObjectName);
  915.  
  916.     return result;
  917. }
  918.  
  919. /*==============================================================================
  920.  *    MF3D_ObjTypeDisposer
  921.  *==============================================================================
  922.  */
  923. MF3DErr
  924. MF3D_ObjTypeDisposer(
  925.     MF3DVoidObjPtr    inObj)
  926. {
  927.     MF3D_VerifyObjectType(inObj, kMF3DObjType);
  928.     MF3D_Unused(inObj);
  929.     return kMF3DErrIllegalObjName;
  930. }
  931.  
  932. /*==============================================================================
  933.  *    MF3D_ObjFaceAttributeSetListReader
  934.  *==============================================================================
  935.  */
  936. MF3DErr
  937. MF3D_ObjFaceAttributeSetListReader(
  938.     MF3D_FilePtr    inMetafilePtr,
  939.     MF3DVoidObjPtr    *outObj)
  940. {
  941.     MF3DFaceAttributeSetListObjPtr    returnObj;
  942.     MF3DUns32                        nObjects;
  943.     MF3DUns32                        nIndices;
  944.     MF3DErr                            result;
  945.  
  946.     result = kMF3DNoErr;
  947.  
  948.     MF3D_Allocate(returnObj);
  949.  
  950.     if (result == kMF3DNoErr)
  951.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->nObjects);
  952.  
  953.     if (result == kMF3DNoErr)
  954.     {    result = MF3D_EnumRead(inMetafilePtr, gMF3D_PackingEnum,
  955.                 &returnObj->packing);
  956.     }
  957.  
  958.     if (result == kMF3DNoErr)
  959.     {    result = MF3D_Uns32Read(inMetafilePtr, &returnObj->nIndices);
  960.         nObjects = returnObj->nObjects;
  961.         nIndices = returnObj->nIndices;
  962.     }
  963.  
  964.     if (result == kMF3DNoErr && nIndices < 0)
  965.         result = kMF3DErrNIndicesLessThanZero;
  966.  
  967.     if (result == kMF3DNoErr && nIndices >= nObjects)
  968.         result = kMF3DErrNIndicesGreaterThanNObjects;
  969.  
  970.     if (result == kMF3DNoErr)
  971.     {    MF3DUns32        indicesToRead;
  972.         MF3DUns32Ptr    curIndexPtr;
  973.  
  974.         returnObj->indices = MF3D_Malloc(nIndices *
  975.                 sizeof(*returnObj->indices));
  976.         if (returnObj->indices == NULL)
  977.             result = kMF3DErrOutOfMemory;
  978.  
  979.         indicesToRead = nIndices;
  980.         curIndexPtr = returnObj->indices;
  981.         while (result == kMF3DNoErr && indicesToRead > 0)
  982.         {    result = MF3D_VariableUnsRead(inMetafilePtr, nObjects, curIndexPtr);
  983.             --indicesToRead;
  984.             ++curIndexPtr;
  985.         }
  986.  
  987.         if (result != kMF3DNoErr)
  988.         {    MF3D_Free(returnObj->indices);
  989.         }
  990.     }
  991.  
  992.     if (result == kMF3DNoErr)
  993.         *outObj = (MF3DVoidObjPtr) returnObj;
  994.     else
  995.         MF3D_Free(returnObj);
  996.  
  997.     return result;
  998. }
  999.  
  1000.  
  1001. /*==============================================================================
  1002.  *    MF3D_ObjFaceAttributeSetListWriter
  1003.  *==============================================================================
  1004.  */
  1005. MF3DErr
  1006. MF3D_ObjFaceAttributeSetListWriter(
  1007.     MF3D_FilePtr    inMetafilePtr,
  1008.     MF3DVoidObjPtr    inObj)
  1009. {
  1010.     MF3DFaceAttributeSetListObjPtr    writeObj;
  1011.     MF3DUns32                        nObjects;
  1012.     MF3DUns32                        nIndices;
  1013.     MF3DErr                            result;
  1014.  
  1015.     MF3D_VerifyObjectType(inObj, kMF3DObjFaceAttributeSetList);
  1016.     writeObj = (MF3DFaceAttributeSetListObjPtr)inObj;
  1017.  
  1018.     nObjects = writeObj->nObjects;
  1019.     nIndices = writeObj->nIndices;
  1020.  
  1021.     MF3D_WriteNewLine(inMetafilePtr);
  1022.     result = MF3D_Uns32Write(inMetafilePtr, nObjects);
  1023.  
  1024.     if (result == kMF3DNoErr)
  1025.     {    result = MF3D_EnumWrite(inMetafilePtr, gMF3D_PackingEnum,
  1026.                 writeObj->packing);
  1027.     }
  1028.  
  1029.     if (result == kMF3DNoErr && nIndices < 0)
  1030.         result = kMF3DErrNIndicesLessThanZero;
  1031.  
  1032.     if (result == kMF3DNoErr && nIndices >= nObjects)
  1033.         result = kMF3DErrNIndicesGreaterThanNObjects;
  1034.  
  1035.     if (result == kMF3DNoErr)
  1036.         result = MF3D_Uns32Write(inMetafilePtr, nIndices);
  1037.  
  1038.     if (result == kMF3DNoErr)
  1039.     {    MF3DUns32Ptr    curIndexPtr;
  1040.  
  1041.         if (nIndices > 0)
  1042.             MF3D_WriteNewLine(inMetafilePtr);
  1043.         curIndexPtr = writeObj->indices;
  1044.         for ( ; result == kMF3DNoErr && nIndices > 0; --nIndices)
  1045.         {    result = MF3D_VariableUnsWrite(inMetafilePtr, nObjects,
  1046.                     *curIndexPtr++);
  1047.         }
  1048.         MF3D_WriteNewLine(inMetafilePtr);
  1049.     }
  1050.  
  1051.     return result;
  1052. }
  1053.  
  1054. /*==============================================================================
  1055.  *    MF3D_ObjFaceAttributeSetListDisposer
  1056.  *==============================================================================
  1057.  */
  1058. MF3DErr
  1059. MF3D_ObjFaceAttributeSetListDisposer(
  1060.     MF3DVoidObjPtr    inObj)
  1061. {
  1062.     MF3D_VerifyObjectType(inObj, kMF3DObjFaceAttributeSetList);
  1063.  
  1064.     if (inObj != NULL)
  1065.     {    MF3D_Free(((MF3DFaceAttributeSetListObjPtr)inObj)->indices);
  1066.         MF3D_Free(inObj);
  1067.     }
  1068.     return kMF3DNoErr;
  1069. }
  1070.  
  1071. /*==============================================================================
  1072.  *    MF3D_ObjGeometryAttributeSetListReader
  1073.  *==============================================================================
  1074.  */
  1075. MF3DErr
  1076. MF3D_ObjGeometryAttributeSetListReader(
  1077.     MF3D_FilePtr    inMetafilePtr,
  1078.     MF3DVoidObjPtr    *outObj)
  1079. {
  1080.     MF3DGeometryAttributeSetListObjPtr    returnObj;
  1081.     MF3DUns32                            nObjects;
  1082.     MF3DUns32                            nIndices;
  1083.     MF3DErr                                result;
  1084.  
  1085.     result = kMF3DNoErr;
  1086.  
  1087.     MF3D_Allocate(returnObj);
  1088.  
  1089.     if (result == kMF3DNoErr)
  1090.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->nObjects);
  1091.  
  1092.     if (result == kMF3DNoErr)
  1093.     {    result = MF3D_EnumRead(inMetafilePtr, gMF3D_PackingEnum,
  1094.                 &returnObj->packing);
  1095.     }
  1096.  
  1097.     if (result == kMF3DNoErr)
  1098.     {    result = MF3D_Uns32Read(inMetafilePtr, &returnObj->nIndices);
  1099.         nObjects = returnObj->nObjects;
  1100.         nIndices = returnObj->nIndices;
  1101.     }
  1102.  
  1103.     if (result == kMF3DNoErr && nIndices < 0)
  1104.         result = kMF3DErrNIndicesLessThanZero;
  1105.  
  1106.     if (result == kMF3DNoErr && nIndices >= nObjects)
  1107.         result = kMF3DErrNIndicesGreaterThanNObjects;
  1108.  
  1109.     if (result == kMF3DNoErr)
  1110.     {    MF3DUns32        indicesToRead;
  1111.         MF3DUns32Ptr    curIndexPtr;
  1112.  
  1113.         returnObj->indices = MF3D_Malloc(nIndices *
  1114.                 sizeof(*returnObj->indices));
  1115.         if (returnObj->indices == NULL)
  1116.             result = kMF3DErrOutOfMemory;
  1117.  
  1118.         indicesToRead = nIndices;
  1119.         curIndexPtr = returnObj->indices;
  1120.         while (result == kMF3DNoErr && indicesToRead > 0)
  1121.         {    result = MF3D_VariableUnsRead(inMetafilePtr, nObjects, curIndexPtr);
  1122.             --indicesToRead;
  1123.             ++curIndexPtr;
  1124.         }
  1125.  
  1126.         if (result != kMF3DNoErr)
  1127.         {    MF3D_Free(returnObj->indices);
  1128.         }
  1129.     }
  1130.  
  1131.     if (result == kMF3DNoErr)
  1132.         *outObj = (MF3DVoidObjPtr) returnObj;
  1133.     else
  1134.         MF3D_Free(returnObj);
  1135.  
  1136.     return result;
  1137. }
  1138.  
  1139.  
  1140. /*==============================================================================
  1141.  *    MF3D_ObjGeometryAttributeSetListWriter
  1142.  *==============================================================================
  1143.  */
  1144. MF3DErr
  1145. MF3D_ObjGeometryAttributeSetListWriter(
  1146.     MF3D_FilePtr    inMetafilePtr,
  1147.     MF3DVoidObjPtr    inObj)
  1148. {
  1149.     MF3DGeometryAttributeSetListObjPtr    writeObj;
  1150.     MF3DUns32                            nObjects;
  1151.     MF3DUns32                            nIndices;
  1152.     MF3DErr                                result;
  1153.  
  1154.     MF3D_VerifyObjectType(inObj, kMF3DObjGeometryAttributeSetList);
  1155.     writeObj = (MF3DGeometryAttributeSetListObjPtr)inObj;
  1156.  
  1157.     nObjects = writeObj->nObjects;
  1158.     nIndices = writeObj->nIndices;
  1159.  
  1160.     MF3D_WriteNewLine(inMetafilePtr);
  1161.     result = MF3D_Uns32Write(inMetafilePtr, nObjects);
  1162.  
  1163.     if (result == kMF3DNoErr)
  1164.     {    result = MF3D_EnumWrite(inMetafilePtr, gMF3D_PackingEnum,
  1165.                 writeObj->packing);
  1166.     }
  1167.  
  1168.     nIndices = writeObj->nIndices;
  1169.     if (result == kMF3DNoErr && nIndices < 0)
  1170.         result = kMF3DErrNIndicesLessThanZero;
  1171.  
  1172.     if (result == kMF3DNoErr && nIndices >= nObjects)
  1173.         result = kMF3DErrNIndicesGreaterThanNObjects;
  1174.  
  1175.     if (result == kMF3DNoErr)
  1176.         result = MF3D_Uns32Write(inMetafilePtr, nIndices);
  1177.  
  1178.     if (result == kMF3DNoErr)
  1179.     {    MF3DUns32Ptr    curIndexPtr;
  1180.  
  1181.         if (nIndices > 0)
  1182.             MF3D_WriteNewLine(inMetafilePtr);
  1183.         curIndexPtr = writeObj->indices;
  1184.         for ( ; result == kMF3DNoErr && nIndices > 0; --nIndices)
  1185.         {    result = MF3D_VariableUnsWrite(inMetafilePtr, nObjects,
  1186.                     *curIndexPtr++);
  1187.         }
  1188.         MF3D_WriteNewLine(inMetafilePtr);
  1189.     }
  1190.  
  1191.     return result;
  1192. }
  1193.  
  1194. /*==============================================================================
  1195.  *    MF3D_ObjGeometryAttributeSetListDisposer
  1196.  *==============================================================================
  1197.  */
  1198. MF3DErr
  1199. MF3D_ObjGeometryAttributeSetListDisposer(
  1200.     MF3DVoidObjPtr    inObj)
  1201. {
  1202.     MF3D_VerifyObjectType(inObj, kMF3DObjGeometryAttributeSetList);
  1203.  
  1204.     if (inObj != NULL)
  1205.     {    MF3D_Free(((MF3DGeometryAttributeSetListObjPtr)inObj)->indices);
  1206.         MF3D_Free(inObj);
  1207.     }
  1208.     return kMF3DNoErr;
  1209. }
  1210.  
  1211. /*==============================================================================
  1212.  *    MF3D_ObjVertexAttributeSetListReader
  1213.  *==============================================================================
  1214.  */
  1215. MF3DErr
  1216. MF3D_ObjVertexAttributeSetListReader(
  1217.     MF3D_FilePtr    inMetafilePtr,
  1218.     MF3DVoidObjPtr    *outObj)
  1219. {
  1220.     MF3DVertexAttributeSetListObjPtr    returnObj;
  1221.     MF3DUns32                            nObjects;
  1222.     MF3DUns32                            nIndices;
  1223.     MF3DErr                                result;
  1224.  
  1225.     result = kMF3DNoErr;
  1226.  
  1227.     MF3D_Allocate(returnObj);
  1228.  
  1229.     if (result == kMF3DNoErr)
  1230.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->nObjects);
  1231.  
  1232.     if (result == kMF3DNoErr)
  1233.     {    result = MF3D_EnumRead(inMetafilePtr, gMF3D_PackingEnum,
  1234.                 &returnObj->packing);
  1235.     }
  1236.  
  1237.     if (result == kMF3DNoErr)
  1238.     {    result = MF3D_Uns32Read(inMetafilePtr, &returnObj->nIndices);
  1239.         nObjects = returnObj->nObjects;
  1240.         nIndices = returnObj->nIndices;
  1241.     }
  1242.  
  1243.     if (result == kMF3DNoErr && nIndices < 0)
  1244.         result = kMF3DErrNIndicesLessThanZero;
  1245.  
  1246.     if (result == kMF3DNoErr && nIndices >= nObjects)
  1247.         result = kMF3DErrNIndicesGreaterThanNObjects;
  1248.  
  1249.     if (result == kMF3DNoErr)
  1250.     {    MF3DUns32        indicesToRead;
  1251.         MF3DUns32Ptr    curIndexPtr;
  1252.  
  1253.         returnObj->indices = MF3D_Malloc(nIndices *
  1254.                 sizeof(*returnObj->indices));
  1255.         if (returnObj->indices == NULL)
  1256.             result = kMF3DErrOutOfMemory;
  1257.  
  1258.         indicesToRead = nIndices;
  1259.         curIndexPtr = returnObj->indices;
  1260.         while (result == kMF3DNoErr && indicesToRead > 0)
  1261.         {    result = MF3D_VariableUnsRead(inMetafilePtr, nObjects, curIndexPtr);
  1262.             --indicesToRead;
  1263.             ++curIndexPtr;
  1264.         }
  1265.  
  1266.         if (result != kMF3DNoErr)
  1267.         {    MF3D_Free(returnObj->indices);
  1268.         }
  1269.     }
  1270.  
  1271.     if (result == kMF3DNoErr)
  1272.         *outObj = (MF3DVoidObjPtr) returnObj;
  1273.     else
  1274.         MF3D_Free(returnObj);
  1275.  
  1276.     return result;
  1277. }
  1278.  
  1279.  
  1280. /*==============================================================================
  1281.  *    MF3D_ObjVertexAttributeSetListWriter
  1282.  *==============================================================================
  1283.  */
  1284. MF3DErr
  1285. MF3D_ObjVertexAttributeSetListWriter(
  1286.     MF3D_FilePtr    inMetafilePtr,
  1287.     MF3DVoidObjPtr    inObj)
  1288. {
  1289.     MF3DVertexAttributeSetListObjPtr    writeObj;
  1290.     MF3DUns32                            nObjects;
  1291.     MF3DUns32                            nIndices;
  1292.     MF3DErr                                result;
  1293.  
  1294.     MF3D_VerifyObjectType(inObj, kMF3DObjVertexAttributeSetList);
  1295.     writeObj = (MF3DVertexAttributeSetListObjPtr)inObj;
  1296.  
  1297.     nObjects = writeObj->nObjects;
  1298.     nIndices = writeObj->nIndices;
  1299.  
  1300.     MF3D_WriteNewLine(inMetafilePtr);
  1301.     result = MF3D_Uns32Write(inMetafilePtr, nObjects);
  1302.  
  1303.     if (result == kMF3DNoErr)
  1304.     {    result = MF3D_EnumWrite(inMetafilePtr, gMF3D_PackingEnum,
  1305.                 writeObj->packing);
  1306.     }
  1307.  
  1308.     nIndices = writeObj->nIndices;
  1309.     if (result == kMF3DNoErr && nIndices < 0)
  1310.         result = kMF3DErrNIndicesLessThanZero;
  1311.  
  1312.     if (result == kMF3DNoErr && nIndices >= nObjects)
  1313.         result = kMF3DErrNIndicesGreaterThanNObjects;
  1314.  
  1315.     if (result == kMF3DNoErr)
  1316.         result = MF3D_Uns32Write(inMetafilePtr, nIndices);
  1317.  
  1318.     if (result == kMF3DNoErr)
  1319.     {    MF3DUns32Ptr    curIndexPtr;
  1320.  
  1321.         if (nIndices > 0)
  1322.             MF3D_WriteNewLine(inMetafilePtr);
  1323.         curIndexPtr = writeObj->indices;
  1324.         for ( ; result == kMF3DNoErr && nIndices > 0; --nIndices)
  1325.         {    result = MF3D_VariableUnsWrite(inMetafilePtr, nObjects,
  1326.                     *curIndexPtr++);
  1327.         }
  1328.         MF3D_WriteNewLine(inMetafilePtr);
  1329.     }
  1330.  
  1331.     return result;
  1332. }
  1333.  
  1334. /*==============================================================================
  1335.  *    MF3D_ObjVertexAttributeSetListDisposer
  1336.  *==============================================================================
  1337.  */
  1338. MF3DErr
  1339. MF3D_ObjVertexAttributeSetListDisposer(
  1340.     MF3DVoidObjPtr    inObj)
  1341. {
  1342.     MF3D_VerifyObjectType(inObj, kMF3DObjVertexAttributeSetList);
  1343.  
  1344.     if (inObj != NULL)
  1345.     {    MF3D_Free(((MF3DVertexAttributeSetListObjPtr)inObj)->indices);
  1346.         MF3D_Free(inObj);
  1347.     }
  1348.     return kMF3DNoErr;
  1349. }
  1350.  
  1351. /*==============================================================================
  1352.  *    MF3D_ObjCameraPlacementReader
  1353.  *==============================================================================
  1354.  */
  1355. MF3DErr
  1356. MF3D_ObjCameraPlacementReader(
  1357.     MF3D_FilePtr    inMetafilePtr,
  1358.     MF3DVoidObjPtr    *outObj)
  1359. {
  1360.     MF3DCameraPlacementObjPtr    returnObj;
  1361.     MF3DErr                        result;
  1362.  
  1363.     result = kMF3DNoErr;
  1364.  
  1365.     MF3D_Allocate(returnObj);
  1366.  
  1367.     if (result == kMF3DNoErr)
  1368.         result = MF3D_Point3DRead(inMetafilePtr, &returnObj->location);
  1369.  
  1370.     if (result == kMF3DNoErr)
  1371.         result = MF3D_Point3DRead(inMetafilePtr, &returnObj->pointOfInterest);
  1372.  
  1373.     if (result == kMF3DNoErr)
  1374.         result = MF3D_Vector3DRead(inMetafilePtr, &returnObj->upVector);
  1375.  
  1376.     if (result == kMF3DNoErr)
  1377.         *outObj = (MF3DVoidObjPtr) returnObj;
  1378.     else
  1379.         MF3D_Free(returnObj);
  1380.  
  1381.     return result;
  1382. }
  1383.  
  1384. /*==============================================================================
  1385.  *    MF3D_ObjCameraPlacementWriter
  1386.  *==============================================================================
  1387.  */
  1388. MF3DErr
  1389. MF3D_ObjCameraPlacementWriter(
  1390.     MF3D_FilePtr    inMetafilePtr,
  1391.     MF3DVoidObjPtr    inObj)
  1392. {
  1393.     MF3DCameraPlacementObjPtr    writeObj;
  1394.     MF3DErr                        result;
  1395.  
  1396.     MF3D_VerifyObjectType(inObj, kMF3DObjCameraPlacement);
  1397.  
  1398.     writeObj = (MF3DCameraPlacementObjPtr)inObj;
  1399.  
  1400.     MF3D_WriteNewLine(inMetafilePtr);
  1401.     result = MF3D_Point3DWrite(inMetafilePtr, writeObj->location);
  1402.  
  1403.     if (result == kMF3DNoErr)
  1404.     {    MF3D_WriteNewLine(inMetafilePtr);
  1405.         result = MF3D_Point3DWrite(inMetafilePtr, writeObj->pointOfInterest);
  1406.     }
  1407.  
  1408.     if (result == kMF3DNoErr)
  1409.     {    MF3D_WriteNewLine(inMetafilePtr);
  1410.         result = MF3D_Vector3DWrite(inMetafilePtr, writeObj->upVector);
  1411.     }
  1412.  
  1413.     if (result == kMF3DNoErr)
  1414.         MF3D_WriteNewLine(inMetafilePtr);
  1415.  
  1416.     return result;
  1417. }
  1418.  
  1419. /*==============================================================================
  1420.  *    MF3D_ObjCameraPlacementDisposer
  1421.  *==============================================================================
  1422.  */
  1423. MF3DErr
  1424. MF3D_ObjCameraPlacementDisposer(
  1425.     MF3DVoidObjPtr    inObj)
  1426. {
  1427.     MF3D_VerifyObjectType(inObj, kMF3DObjCameraPlacement);
  1428.  
  1429.     MF3D_Free(inObj);
  1430.     return kMF3DNoErr;
  1431. }
  1432.  
  1433. /*==============================================================================
  1434.  *    MF3D_ObjCameraRangeReader
  1435.  *==============================================================================
  1436.  */
  1437. MF3DErr
  1438. MF3D_ObjCameraRangeReader(
  1439.     MF3D_FilePtr    inMetafilePtr,
  1440.     MF3DVoidObjPtr    *outObj)
  1441. {
  1442.     MF3DCameraRangeObjPtr        returnObj;
  1443.     MF3DErr                        result;
  1444.  
  1445.     result = kMF3DNoErr;
  1446.  
  1447.     MF3D_Allocate(returnObj);
  1448.  
  1449.     if (result == kMF3DNoErr)
  1450.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->hither);
  1451.  
  1452.     if (result == kMF3DNoErr)
  1453.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->yon);
  1454.  
  1455.     if (result == kMF3DNoErr)
  1456.         *outObj = (MF3DVoidObjPtr) returnObj;
  1457.     else
  1458.         MF3D_Free(returnObj);
  1459.  
  1460.     return result;
  1461. }
  1462.  
  1463. /*==============================================================================
  1464.  *    MF3D_ObjCameraRangeWriter
  1465.  *==============================================================================
  1466.  */
  1467. MF3DErr
  1468. MF3D_ObjCameraRangeWriter(
  1469.     MF3D_FilePtr    inMetafilePtr,
  1470.     MF3DVoidObjPtr    inObj)
  1471. {
  1472.     MF3DCameraRangeObjPtr        writeObj;
  1473.     MF3DErr                        result;
  1474.  
  1475.     MF3D_VerifyObjectType(inObj, kMF3DObjCameraRange);
  1476.     writeObj = (MF3DCameraRangeObjPtr)inObj;
  1477.  
  1478.     result = MF3D_Float32Write(inMetafilePtr, writeObj->hither);
  1479.  
  1480.     if (result == kMF3DNoErr)
  1481.         result = MF3D_Float32Write(inMetafilePtr, writeObj->yon);
  1482.  
  1483.     return result;
  1484. }
  1485.  
  1486. /*==============================================================================
  1487.  *    MF3D_ObjCameraRangeDisposer
  1488.  *==============================================================================
  1489.  */
  1490. MF3DErr
  1491. MF3D_ObjCameraRangeDisposer(
  1492.     MF3DVoidObjPtr    inObj)
  1493. {
  1494.     MF3D_VerifyObjectType(inObj, kMF3DObjCameraRange);
  1495.  
  1496.     MF3D_Free(inObj);
  1497.     return kMF3DNoErr;
  1498. }
  1499.  
  1500. /*==============================================================================
  1501.  *    MF3D_ObjCameraViewPortReader
  1502.  *==============================================================================
  1503.  */
  1504. MF3DErr
  1505. MF3D_ObjCameraViewPortReader(
  1506.     MF3D_FilePtr    inMetafilePtr,
  1507.     MF3DVoidObjPtr    *outObj)
  1508. {
  1509.     MF3DCameraViewPortObjPtr    returnObj;
  1510.     MF3DErr                        result;
  1511.  
  1512.     result = kMF3DNoErr;
  1513.  
  1514.     MF3D_Allocate(returnObj);
  1515.  
  1516.     if (result == kMF3DNoErr)
  1517.         result = MF3D_Point2DRead(inMetafilePtr, &returnObj->origin);
  1518.  
  1519.     if (result == kMF3DNoErr)
  1520.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->width);
  1521.  
  1522.     if (result == kMF3DNoErr)
  1523.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->height);
  1524.  
  1525.     if (result == kMF3DNoErr)
  1526.         *outObj = (MF3DVoidObjPtr) returnObj;
  1527.     else
  1528.         MF3D_Free(returnObj);
  1529.  
  1530.     return result;
  1531. }
  1532.  
  1533. /*==============================================================================
  1534.  *    MF3D_ObjCameraViewPortWriter
  1535.  *==============================================================================
  1536.  */
  1537. MF3DErr
  1538. MF3D_ObjCameraViewPortWriter(
  1539.     MF3D_FilePtr    inMetafilePtr,
  1540.     MF3DVoidObjPtr    inObj)
  1541. {
  1542.     MF3DCameraViewPortObjPtr    writeObj;
  1543.     MF3DErr                        result;
  1544.  
  1545.     MF3D_VerifyObjectType(inObj, kMF3DObjCameraViewPort);
  1546.     writeObj = (MF3DCameraViewPortObjPtr)inObj;
  1547.  
  1548.     result = MF3D_Point2DWrite(inMetafilePtr, writeObj->origin);
  1549.  
  1550.     if (result == kMF3DNoErr)
  1551.         result = MF3D_Float32Write(inMetafilePtr, writeObj->width);
  1552.  
  1553.     if (result == kMF3DNoErr)
  1554.         result = MF3D_Float32Write(inMetafilePtr, writeObj->height);
  1555.  
  1556.     return result;
  1557. }
  1558.  
  1559. /*==============================================================================
  1560.  *    MF3D_ObjCameraViewPortDisposer
  1561.  *==============================================================================
  1562.  */
  1563. MF3DErr
  1564. MF3D_ObjCameraViewPortDisposer(
  1565.     MF3DVoidObjPtr    inObj)
  1566. {
  1567.     MF3D_VerifyObjectType(inObj, kMF3DObjCameraViewPort);
  1568.  
  1569.     MF3D_Free(inObj);
  1570.     return kMF3DNoErr;
  1571. }
  1572.  
  1573. /*==============================================================================
  1574.  *    MF3D_ObjBottomCapAttributeSetReader
  1575.  *==============================================================================
  1576.  */
  1577. MF3DErr
  1578. MF3D_ObjBottomCapAttributeSetReader(
  1579.     MF3D_FilePtr    inMetafilePtr,
  1580.     MF3DVoidObjPtr    *outObj)
  1581. {
  1582.     MF3DBottomCapAttributeSetObjPtr    returnObj;
  1583.     MF3DErr                            result;
  1584.  
  1585.     MF3D_Unused(inMetafilePtr);
  1586.     result = kMF3DNoErr;
  1587.  
  1588.     MF3D_Allocate(returnObj);
  1589.  
  1590.     if (result == kMF3DNoErr)
  1591.         *outObj = (MF3DVoidObjPtr) returnObj;
  1592.     else
  1593.         MF3D_Free(returnObj);
  1594.  
  1595.     return result;
  1596. }
  1597.  
  1598. /*==============================================================================
  1599.  *    MF3D_ObjBottomCapAttributeSetWriter
  1600.  *==============================================================================
  1601.  */
  1602. MF3DErr
  1603. MF3D_ObjBottomCapAttributeSetWriter(
  1604.     MF3D_FilePtr    inMetafilePtr,
  1605.     MF3DVoidObjPtr    inObj)
  1606. {
  1607.     MF3D_VerifyObjectType(inObj, kMF3DObjBottomCapAttributeSet);
  1608.     MF3D_Unused(inMetafilePtr);
  1609.     MF3D_Unused(inObj);
  1610.     /* Nothing to write! */
  1611.     return kMF3DNoErr;
  1612. }
  1613.  
  1614. /*==============================================================================
  1615.  *    MF3D_ObjBottomCapAttributeSetDisposer
  1616.  *==============================================================================
  1617.  */
  1618. MF3DErr
  1619. MF3D_ObjBottomCapAttributeSetDisposer(
  1620.     MF3DVoidObjPtr    inObj)
  1621. {
  1622.     MF3D_VerifyObjectType(inObj, kMF3DObjBottomCapAttributeSet);
  1623.  
  1624.     MF3D_Free(inObj);
  1625.     return kMF3DNoErr;
  1626. }
  1627.  
  1628. /*==============================================================================
  1629.  *    MF3D_ObjCapsReader
  1630.  *==============================================================================
  1631.  */
  1632. MF3DErr
  1633. MF3D_ObjCapsReader(
  1634.     MF3D_FilePtr    inMetafilePtr,
  1635.     MF3DVoidObjPtr    *outObj)
  1636. {
  1637.     MF3DCapsObjPtr                returnObj;
  1638.     MF3DErr                        result;
  1639.  
  1640.     result = kMF3DNoErr;
  1641.  
  1642.     MF3D_Allocate(returnObj);
  1643.  
  1644.     if (result == kMF3DNoErr)
  1645.     {    result = MF3D_FlagsRead(inMetafilePtr, gMF3D_CapsFlags,
  1646.                 &returnObj->caps);
  1647.     }
  1648.  
  1649.     if (result == kMF3DNoErr)
  1650.         *outObj = (MF3DVoidObjPtr) returnObj;
  1651.     else
  1652.         MF3D_Free(returnObj);
  1653.  
  1654.     return result;
  1655. }
  1656.  
  1657. /*==============================================================================
  1658.  *    MF3D_ObjCapsWriter
  1659.  *==============================================================================
  1660.  */
  1661. MF3DErr
  1662. MF3D_ObjCapsWriter(
  1663.     MF3D_FilePtr    inMetafilePtr,
  1664.     MF3DVoidObjPtr    inObj)
  1665. {
  1666.     MF3D_VerifyObjectType(inObj, kMF3DObjCaps);
  1667.     return MF3D_FlagsWrite(inMetafilePtr, gMF3D_CapsFlags,
  1668.                 ((MF3DCapsObjPtr)inObj)->caps);
  1669. }
  1670.  
  1671. /*==============================================================================
  1672.  *    MF3D_ObjCapsDisposer
  1673.  *==============================================================================
  1674.  */
  1675. MF3DErr
  1676. MF3D_ObjCapsDisposer(
  1677.     MF3DVoidObjPtr    inObj)
  1678. {
  1679.     MF3D_VerifyObjectType(inObj, kMF3DObjCaps);
  1680.  
  1681.     MF3D_Free(inObj);
  1682.     return kMF3DNoErr;
  1683. }
  1684.  
  1685. /*==============================================================================
  1686.  *    MF3D_ObjFaceCapAttributeSetReader
  1687.  *==============================================================================
  1688.  */
  1689. MF3DErr
  1690. MF3D_ObjFaceCapAttributeSetReader(
  1691.     MF3D_FilePtr    inMetafilePtr,
  1692.     MF3DVoidObjPtr    *outObj)
  1693. {
  1694.     MF3DFaceCapAttributeSetObjPtr    returnObj;
  1695.     MF3DErr                        result;
  1696.  
  1697.     MF3D_Unused(inMetafilePtr);
  1698.     result = kMF3DNoErr;
  1699.  
  1700.     MF3D_Allocate(returnObj);
  1701.  
  1702.     if (result == kMF3DNoErr)
  1703.         *outObj = (MF3DVoidObjPtr) returnObj;
  1704.     else
  1705.         MF3D_Free(returnObj);
  1706.  
  1707.     return result;
  1708. }
  1709.  
  1710. /*==============================================================================
  1711.  *    MF3D_ObjFaceCapAttributeSetWriter
  1712.  *==============================================================================
  1713.  */
  1714. MF3DErr
  1715. MF3D_ObjFaceCapAttributeSetWriter(
  1716.     MF3D_FilePtr    inMetafilePtr,
  1717.     MF3DVoidObjPtr    inObj)
  1718. {
  1719.     MF3D_VerifyObjectType(inObj, kMF3DObjFaceCapAttributeSet);
  1720.     MF3D_Unused(inMetafilePtr);
  1721.     MF3D_Unused(inObj);
  1722.     /* Nothing to write! */
  1723.     return kMF3DNoErr;
  1724. }
  1725.  
  1726. /*==============================================================================
  1727.  *    MF3D_ObjFaceCapAttributeSetDisposer
  1728.  *==============================================================================
  1729.  */
  1730. MF3DErr
  1731. MF3D_ObjFaceCapAttributeSetDisposer(
  1732.     MF3DVoidObjPtr    inObj)
  1733. {
  1734.     MF3D_VerifyObjectType(inObj, kMF3DObjFaceCapAttributeSet);
  1735.  
  1736.     MF3D_Free(inObj);
  1737.     return kMF3DNoErr;
  1738. }
  1739.  
  1740. /*==============================================================================
  1741.  *    MF3D_ObjTopCapAttributeSetReader
  1742.  *==============================================================================
  1743.  */
  1744. MF3DErr
  1745. MF3D_ObjTopCapAttributeSetReader(
  1746.     MF3D_FilePtr    inMetafilePtr,
  1747.     MF3DVoidObjPtr    *outObj)
  1748. {
  1749.     MF3DTopCapAttributeSetObjPtr    returnObj;
  1750.     MF3DErr                        result;
  1751.  
  1752.     MF3D_Unused(inMetafilePtr);
  1753.     result = kMF3DNoErr;
  1754.  
  1755.     MF3D_Allocate(returnObj);
  1756.  
  1757.     if (result == kMF3DNoErr)
  1758.         *outObj = (MF3DVoidObjPtr) returnObj;
  1759.     else
  1760.         MF3D_Free(returnObj);
  1761.  
  1762.     return result;
  1763. }
  1764.  
  1765. /*==============================================================================
  1766.  *    MF3D_ObjTopCapAttributeSetWriter
  1767.  *==============================================================================
  1768.  */
  1769. MF3DErr
  1770. MF3D_ObjTopCapAttributeSetWriter(
  1771.     MF3D_FilePtr    inMetafilePtr,
  1772.     MF3DVoidObjPtr    inObj)
  1773. {
  1774.     MF3D_VerifyObjectType(inObj, kMF3DObjTopCapAttributeSet);
  1775.     MF3D_Unused(inMetafilePtr);
  1776.     MF3D_Unused(inObj);
  1777.     /* Nothing to write! */
  1778.     return kMF3DNoErr;
  1779. }
  1780.  
  1781. /*==============================================================================
  1782.  *    MF3D_ObjTopCapAttributeSetDisposer
  1783.  *==============================================================================
  1784.  */
  1785. MF3DErr
  1786. MF3D_ObjTopCapAttributeSetDisposer(
  1787.     MF3DVoidObjPtr    inObj)
  1788. {
  1789.     MF3D_VerifyObjectType(inObj, kMF3DObjTopCapAttributeSet);
  1790.  
  1791.     MF3D_Free(inObj);
  1792.     return kMF3DNoErr;
  1793. }
  1794.  
  1795. /*==============================================================================
  1796.  *    MF3D_ObjDisplayGroupStateReader
  1797.  *==============================================================================
  1798.  */
  1799. MF3DErr
  1800. MF3D_ObjDisplayGroupStateReader(
  1801.     MF3D_FilePtr    inMetafilePtr,
  1802.     MF3DVoidObjPtr    *outObj)
  1803. {
  1804.     MF3DDisplayGroupStateObjPtr    returnObj;
  1805.     MF3DErr                        result;
  1806.  
  1807.     result = kMF3DNoErr;
  1808.  
  1809.     MF3D_Allocate(returnObj);
  1810.  
  1811.     if (result == kMF3DNoErr)
  1812.     {    result = MF3D_FlagsRead(inMetafilePtr, gMF3D_DisplayGroupStateFlags,
  1813.                 &returnObj->traversalFlags);
  1814.     }
  1815.  
  1816.     if (result == kMF3DNoErr)
  1817.         *outObj = (MF3DVoidObjPtr) returnObj;
  1818.     else
  1819.         MF3D_Free(returnObj);
  1820.  
  1821.     return result;
  1822. }
  1823.  
  1824. /*==============================================================================
  1825.  *    MF3D_ObjDisplayGroupStateWriter
  1826.  *==============================================================================
  1827.  */
  1828. MF3DErr
  1829. MF3D_ObjDisplayGroupStateWriter(
  1830.     MF3D_FilePtr    inMetafilePtr,
  1831.     MF3DVoidObjPtr    inObj)
  1832. {
  1833.     MF3D_VerifyObjectType(inObj, kMF3DObjDisplayGroupState);
  1834.  
  1835.     return MF3D_FlagsWrite(inMetafilePtr, gMF3D_DisplayGroupStateFlags,
  1836.                 ((MF3DDisplayGroupStateObjPtr)inObj)->traversalFlags);
  1837. }
  1838.  
  1839. /*==============================================================================
  1840.  *    MF3D_ObjDisplayGroupStateDisposer
  1841.  *==============================================================================
  1842.  */
  1843. MF3DErr
  1844. MF3D_ObjDisplayGroupStateDisposer(
  1845.     MF3DVoidObjPtr    inObj)
  1846. {
  1847.     MF3D_VerifyObjectType(inObj, kMF3DObjDisplayGroupState);
  1848.  
  1849.     MF3D_Free(inObj);
  1850.     return kMF3DNoErr;
  1851. }
  1852.  
  1853. /*==============================================================================
  1854.  *    MF3D_ObjLightDataReader
  1855.  *==============================================================================
  1856.  */
  1857. MF3DErr
  1858. MF3D_ObjLightDataReader(
  1859.     MF3D_FilePtr    inMetafilePtr,
  1860.     MF3DVoidObjPtr    *outObj)
  1861. {
  1862.     MF3DLightDataObjPtr            returnObj;
  1863.     MF3DErr                        result;
  1864.  
  1865.     result = kMF3DNoErr;
  1866.  
  1867.     MF3D_Allocate(returnObj);
  1868.  
  1869.     if (result == kMF3DNoErr)
  1870.         MF3D_BooleanRead(inMetafilePtr, &returnObj->isOn);
  1871.  
  1872.     if (result == kMF3DNoErr)
  1873.         MF3D_Float32Read(inMetafilePtr, &returnObj->intensity);
  1874.  
  1875.     if (result == kMF3DNoErr)
  1876.         MF3D_RGBColorRead(inMetafilePtr, &returnObj->color);
  1877.  
  1878.     if (result == kMF3DNoErr)
  1879.         *outObj = (MF3DVoidObjPtr) returnObj;
  1880.     else
  1881.         MF3D_Free(returnObj);
  1882.  
  1883.     return result;
  1884. }
  1885.  
  1886. /*==============================================================================
  1887.  *    MF3D_ObjLightDataWriter
  1888.  *==============================================================================
  1889.  */
  1890. MF3DErr
  1891. MF3D_ObjLightDataWriter(
  1892.     MF3D_FilePtr    inMetafilePtr,
  1893.     MF3DVoidObjPtr    inObj)
  1894. {
  1895.     MF3DLightDataObjPtr            writeObj;
  1896.     MF3DErr                        result;
  1897.  
  1898.     MF3D_VerifyObjectType(inObj, kMF3DObjLightData);
  1899.     writeObj = (MF3DLightDataObjPtr)inObj;
  1900.  
  1901.     result = MF3D_BooleanWrite(inMetafilePtr, writeObj->isOn);
  1902.  
  1903.     if (result == kMF3DNoErr)
  1904.         result = MF3D_Float32Write(inMetafilePtr, writeObj->intensity);
  1905.  
  1906.     if (result == kMF3DNoErr)
  1907.         result = MF3D_RGBColorWrite(inMetafilePtr, writeObj->color);
  1908.  
  1909.     return result;
  1910. }
  1911.  
  1912. /*==============================================================================
  1913.  *    MF3D_ObjLightDataDisposer
  1914.  *==============================================================================
  1915.  */
  1916. MF3DErr
  1917. MF3D_ObjLightDataDisposer(
  1918.     MF3DVoidObjPtr    inObj)
  1919. {
  1920.     MF3D_VerifyObjectType(inObj, kMF3DObjLightData);
  1921.  
  1922.     MF3D_Free(inObj);
  1923.     return kMF3DNoErr;
  1924. }
  1925.  
  1926. /*==============================================================================
  1927.  *    MF3D_ObjMeshCornersReader
  1928.  *==============================================================================
  1929.  */
  1930. MF3DErr
  1931. MF3D_ObjMeshCornersReader(
  1932.     MF3D_FilePtr    inMetafilePtr,
  1933.     MF3DVoidObjPtr    *outObj)
  1934. {
  1935.     MF3DMeshCornersObjPtr        returnObj;
  1936.     MF3DErr                        result;
  1937.     MF3DUns32                    numCorners;
  1938.  
  1939.     result = kMF3DNoErr;
  1940.  
  1941.     MF3D_Allocate(returnObj);
  1942.  
  1943.     if (result == kMF3DNoErr)
  1944.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->nCorners);
  1945.  
  1946.     if (result == kMF3DNoErr)
  1947.     {    numCorners = returnObj->nCorners;
  1948.         if (numCorners <= 0)
  1949.             result = kMF3DErrNumCornersIsZero;
  1950.     }
  1951.  
  1952.     if (result == kMF3DNoErr)
  1953.     {    MF3DMeshCornerPtr    curCornerPtr;
  1954.  
  1955.         returnObj->corners = MF3D_Malloc(numCorners *
  1956.                 sizeof(*returnObj->corners));
  1957.         if (returnObj->corners == NULL)
  1958.             result = kMF3DErrOutOfMemory;
  1959.  
  1960.         curCornerPtr = returnObj->corners;
  1961.         while (result == kMF3DNoErr && numCorners > 0)
  1962.         {    MF3DUns32        numFaces;
  1963.  
  1964.             result = MF3D_Uns32Read(inMetafilePtr, &curCornerPtr->vertexIndex);
  1965.  
  1966.             if (result == kMF3DNoErr)
  1967.                 result = MF3D_Uns32Read(inMetafilePtr, &curCornerPtr->nFaces);
  1968.  
  1969.             if (result == kMF3DNoErr)
  1970.             {    numFaces = curCornerPtr->nFaces;
  1971.                 if (numFaces <= 0)
  1972.                     result = kMF3DErrNumFacesIsZero;
  1973.             }
  1974.  
  1975.             if (result == kMF3DNoErr)
  1976.             {    MF3DUns32Ptr    curFacePtr;
  1977.     
  1978.                 curCornerPtr->faces = MF3D_Malloc(numFaces *
  1979.                         sizeof(*curCornerPtr->faces));
  1980.                 if (curCornerPtr->faces == NULL)
  1981.                     result = kMF3DErrOutOfMemory;
  1982.  
  1983.                 curFacePtr = curCornerPtr->faces;
  1984.                 while (result == kMF3DNoErr && numFaces > 0)
  1985.                 {    result = MF3D_Uns32Read(inMetafilePtr, curFacePtr);
  1986.                     --numFaces;
  1987.                     ++curFacePtr;
  1988.                 }
  1989.  
  1990.                 if (result != kMF3DNoErr)
  1991.                 {    MF3D_Free(curCornerPtr->faces);
  1992.                 }
  1993.             }
  1994.  
  1995.             --numCorners;
  1996.             ++curCornerPtr;
  1997.         }
  1998.  
  1999.         if (result != kMF3DNoErr)
  2000.         {    MF3D_Free(returnObj->corners);
  2001.         }
  2002.     }
  2003.  
  2004.     if (result == kMF3DNoErr)
  2005.         *outObj = (MF3DVoidObjPtr) returnObj;
  2006.     else
  2007.         MF3D_Free(returnObj);
  2008.  
  2009.     return result;
  2010. }
  2011.  
  2012. /*==============================================================================
  2013.  *    MF3D_ObjMeshCornersWriter
  2014.  *==============================================================================
  2015.  */
  2016. MF3DErr
  2017. MF3D_ObjMeshCornersWriter(
  2018.     MF3D_FilePtr    inMetafilePtr,
  2019.     MF3DVoidObjPtr    inObj)
  2020. {
  2021.     MF3DMeshCornersObjPtr        writeObj;
  2022.     MF3DUns32                    nCorners;
  2023.     MF3DErr                        result;
  2024.  
  2025.     MF3D_VerifyObjectType(inObj, kMF3DObjMeshCorners);
  2026.     writeObj = (MF3DMeshCornersObjPtr)inObj;
  2027.  
  2028.     result = kMF3DNoErr;
  2029.  
  2030.     nCorners = writeObj->nCorners;
  2031.     if (nCorners <= 0)
  2032.         result = kMF3DErrNumCornersIsZero;
  2033.  
  2034.     if (result == kMF3DNoErr)
  2035.     {    MF3D_WriteNewLine(inMetafilePtr);
  2036.         result = MF3D_Uns32Write(inMetafilePtr, nCorners);
  2037.     }
  2038.  
  2039.     if (result == kMF3DNoErr)
  2040.         MF3D_CommentStrWrite(inMetafilePtr, "nCorners");
  2041.  
  2042.     if (result == kMF3DNoErr)
  2043.     {    MF3DUns32            cornerNum;
  2044.         MF3DMeshCornerPtr    curCornerPtr;
  2045.         
  2046.         curCornerPtr = writeObj->corners;
  2047.         for (cornerNum = 0;
  2048.                 result == kMF3DNoErr && cornerNum < nCorners;
  2049.                 ++cornerNum)
  2050.         {    MF3DUns32        nFaces;
  2051.  
  2052.             result = MF3D_Uns32Write(inMetafilePtr, curCornerPtr->vertexIndex);
  2053.  
  2054.             nFaces = curCornerPtr->nFaces;
  2055.             if (nFaces <= 0)
  2056.                 result = kMF3DErrNumFacesIsZero;
  2057.  
  2058.             if (result == kMF3DNoErr)
  2059.                 result = MF3D_Uns32Write(inMetafilePtr, nFaces);
  2060.  
  2061.             if (result == kMF3DNoErr)
  2062.             {    MF3DUns32Ptr    curFacePtr;
  2063.     
  2064.                 curFacePtr = curCornerPtr->faces;
  2065.                 for ( ; result == kMF3DNoErr && nFaces > 0; --nFaces)
  2066.                 {    result = MF3D_Uns32Write(inMetafilePtr, *curFacePtr++);
  2067.                 }
  2068.             }
  2069.             if (result == kMF3DNoErr)
  2070.                 MF3D_CommentNumWrite(inMetafilePtr, cornerNum);
  2071.             ++curCornerPtr;
  2072.         }
  2073.     }
  2074.  
  2075.     return result;
  2076. }
  2077.  
  2078. /*==============================================================================
  2079.  *    MF3D_ObjMeshCornersDisposer
  2080.  *==============================================================================
  2081.  */
  2082. MF3DErr
  2083. MF3D_ObjMeshCornersDisposer(
  2084.     MF3DVoidObjPtr    inObj)
  2085. {
  2086.     MF3DMeshCornersObjPtr    mcObj;
  2087.  
  2088.     MF3D_VerifyObjectType(inObj, kMF3DObjMeshCorners);
  2089.  
  2090.     mcObj = (MF3DMeshCornersObjPtr) inObj;
  2091.  
  2092.     if (mcObj != NULL && mcObj->corners != NULL)
  2093.     {    MF3DUns32            numCorners;
  2094.         MF3DMeshCornerPtr    cornerPtr;
  2095.  
  2096.         cornerPtr = mcObj->corners;
  2097.         for (numCorners = mcObj->nCorners; numCorners > 0; --numCorners)
  2098.         {    MF3D_Free(cornerPtr->faces);
  2099.             ++cornerPtr;
  2100.         }
  2101.  
  2102.         MF3D_Free(mcObj->corners);
  2103.     }
  2104.     MF3D_Free(mcObj);
  2105.     return kMF3DNoErr;
  2106. }
  2107.  
  2108. /*==============================================================================
  2109.  *    MF3D_ObjMeshEdgesReader
  2110.  *==============================================================================
  2111.  */
  2112. MF3DErr
  2113. MF3D_ObjMeshEdgesReader(
  2114.     MF3D_FilePtr    inMetafilePtr,
  2115.     MF3DVoidObjPtr    *outObj)
  2116. {
  2117.     MF3DMeshEdgesObjPtr            returnObj;
  2118.     MF3DErr                        result;
  2119.     MF3DUns32                    numEdges;
  2120.  
  2121.     result = kMF3DNoErr;
  2122.  
  2123.     MF3D_Allocate(returnObj);
  2124.  
  2125.     if (result == kMF3DNoErr)
  2126.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->nEdges);
  2127.  
  2128.     if (result == kMF3DNoErr)
  2129.     {    numEdges = returnObj->nEdges;
  2130.         if (numEdges <= 0)
  2131.             result = kMF3DErrNumEdgesIsZero;
  2132.     }
  2133.  
  2134.     if (result == kMF3DNoErr)
  2135.     {    MF3DMeshEdgePtr        curEdgePtr;
  2136.  
  2137.         returnObj->edges = MF3D_Malloc(numEdges * sizeof(*returnObj->edges));
  2138.         if (returnObj->edges == NULL)
  2139.             result = kMF3DErrOutOfMemory;
  2140.  
  2141.         curEdgePtr = returnObj->edges;
  2142.         while (result == kMF3DNoErr && numEdges > 0)
  2143.         {    result = MF3D_Uns32Read(inMetafilePtr, &curEdgePtr->vertexIndex1);
  2144.  
  2145.             if (result == kMF3DNoErr)
  2146.             {    result = MF3D_Uns32Read(inMetafilePtr,
  2147.                         &curEdgePtr->vertexIndex2);
  2148.             }
  2149.  
  2150.             --numEdges;
  2151.             ++curEdgePtr;
  2152.         }
  2153.  
  2154.         if (result != kMF3DNoErr)
  2155.         {    MF3D_Free(returnObj->edges);
  2156.         }
  2157.     }
  2158.  
  2159.     if (result == kMF3DNoErr)
  2160.         *outObj = (MF3DVoidObjPtr) returnObj;
  2161.     else
  2162.         MF3D_Free(returnObj);
  2163.  
  2164.     return result;
  2165. }
  2166.  
  2167. /*==============================================================================
  2168.  *    MF3D_ObjMeshEdgesWriter
  2169.  *==============================================================================
  2170.  */
  2171. MF3DErr
  2172. MF3D_ObjMeshEdgesWriter(
  2173.     MF3D_FilePtr    inMetafilePtr,
  2174.     MF3DVoidObjPtr    inObj)
  2175. {
  2176.     MF3DMeshEdgesObjPtr            writeObj;
  2177.     MF3DUns32                    nEdges;
  2178.     MF3DErr                        result;
  2179.  
  2180.     MF3D_VerifyObjectType(inObj, kMF3DObjMeshEdges);
  2181.     writeObj = (MF3DMeshEdgesObjPtr) inObj;
  2182.  
  2183.     result = kMF3DNoErr;
  2184.  
  2185.     nEdges = writeObj->nEdges;
  2186.     if (nEdges <= 0)
  2187.         result = kMF3DErrNumEdgesIsZero;
  2188.  
  2189.     if (result == kMF3DNoErr)
  2190.     {    MF3D_WriteNewLine(inMetafilePtr);
  2191.         result = MF3D_Uns32Write(inMetafilePtr, nEdges);
  2192.     }
  2193.  
  2194.     if (result == kMF3DNoErr)
  2195.         MF3D_CommentStrWrite(inMetafilePtr, "nEdges");
  2196.  
  2197.     if (result == kMF3DNoErr)
  2198.     {    MF3DUns32            edgeNum;
  2199.         MF3DMeshEdgePtr        curEdgePtr;
  2200.         
  2201.         curEdgePtr = writeObj->edges;
  2202.         for (edgeNum = 0;
  2203.                 result == kMF3DNoErr && edgeNum < nEdges;
  2204.                 ++edgeNum)
  2205.         {    result = MF3D_Uns32Write(inMetafilePtr, curEdgePtr->vertexIndex1);
  2206.  
  2207.             if (result == kMF3DNoErr)
  2208.             {    result = MF3D_Uns32Write(inMetafilePtr,
  2209.                         curEdgePtr->vertexIndex2);
  2210.             }
  2211.  
  2212.             if (result == kMF3DNoErr)
  2213.                 MF3D_CommentNumWrite(inMetafilePtr, edgeNum);
  2214.  
  2215.             ++curEdgePtr;
  2216.         }
  2217.     }
  2218.  
  2219.     return result;
  2220. }
  2221.  
  2222. /*==============================================================================
  2223.  *    MF3D_ObjMeshEdgesDisposer
  2224.  *==============================================================================
  2225.  */
  2226. MF3DErr
  2227. MF3D_ObjMeshEdgesDisposer(
  2228.     MF3DVoidObjPtr    inObj)
  2229. {
  2230.     MF3D_VerifyObjectType(inObj, kMF3DObjMeshEdges);
  2231.  
  2232.     if (inObj != NULL)
  2233.     {    MF3D_Free(((MF3DMeshEdgesObjPtr)inObj)->edges);
  2234.         MF3D_Free(inObj);
  2235.     }
  2236.  
  2237.     return kMF3DNoErr;
  2238. }
  2239.  
  2240. /*==============================================================================
  2241.  *    MF3D_ObjNURBCurve2DReader
  2242.  *==============================================================================
  2243.  */
  2244. MF3DErr
  2245. MF3D_ObjNURBCurve2DReader(
  2246.     MF3D_FilePtr    inMetafilePtr,
  2247.     MF3DVoidObjPtr    *outObj)
  2248. {
  2249.     MF3DNURBCurve2DObjPtr        returnObj;
  2250.     MF3DUns32                    numPoints;
  2251.     MF3DUns32                    order;
  2252.     MF3DUns32                    numKnots;
  2253.     MF3DErr                        result;
  2254.  
  2255.     result = kMF3DNoErr;
  2256.  
  2257.     MF3D_Allocate(returnObj);
  2258.  
  2259.     if (result == kMF3DNoErr)
  2260.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->order);
  2261.  
  2262.     if (result == kMF3DNoErr)
  2263.     {    order = returnObj->order;
  2264.         if (order < 2)
  2265.             result = kMF3DErrOrderTooSmall;
  2266.     }
  2267.  
  2268.     if (result == kMF3DNoErr)
  2269.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->nPoints);
  2270.  
  2271.     if (result == kMF3DNoErr)
  2272.     {    numPoints = returnObj->nPoints;
  2273.         numKnots = numPoints + order;
  2274.         if (numPoints < 2)
  2275.             result = kMF3DErrTooFewPoints;
  2276.     }
  2277.  
  2278.     if (result == kMF3DNoErr)
  2279.     {    MF3DRationalPoint3DPtr    curPointPtr;
  2280.  
  2281.         returnObj->points = MF3D_Malloc(numPoints * sizeof(*returnObj->points));
  2282.         if (returnObj->points == NULL)
  2283.             result = kMF3DErrOutOfMemory;
  2284.  
  2285.         curPointPtr = returnObj->points;
  2286.         while (result == kMF3DNoErr && numPoints > 0)
  2287.         {    result = MF3D_RationalPoint3DRead(inMetafilePtr, curPointPtr);
  2288.             --numPoints;
  2289.             ++curPointPtr;
  2290.         }
  2291.  
  2292.         if (result != kMF3DNoErr)
  2293.         {    MF3D_Free(returnObj->points);
  2294.         }
  2295.     }
  2296.  
  2297.     if (result == kMF3DNoErr)
  2298.     {    MF3DKnotPtr        curKnotPtr;
  2299.  
  2300.         returnObj->knots = MF3D_Malloc(numKnots * sizeof(*returnObj->knots));
  2301.         if (returnObj->knots == NULL)
  2302.             result = kMF3DErrOutOfMemory;
  2303.  
  2304.         curKnotPtr = returnObj->knots;
  2305.         while (result == kMF3DNoErr && numKnots > 0)
  2306.         {    result = MF3D_Float32Read(inMetafilePtr, curKnotPtr);
  2307.             --numKnots;
  2308.             ++curKnotPtr;
  2309.         }
  2310.  
  2311.         if (result != kMF3DNoErr)
  2312.         {    MF3D_Free(returnObj->knots);
  2313.         }
  2314.     }
  2315.  
  2316.     if (result == kMF3DNoErr)
  2317.         *outObj = (MF3DVoidObjPtr) returnObj;
  2318.     else
  2319.         MF3D_Free(returnObj);
  2320.  
  2321.     return result;
  2322. }
  2323.  
  2324. /*==============================================================================
  2325.  *    MF3D_ObjNURBCurve2DWriter
  2326.  *==============================================================================
  2327.  */
  2328. MF3DErr
  2329. MF3D_ObjNURBCurve2DWriter(
  2330.     MF3D_FilePtr    inMetafilePtr,
  2331.     MF3DVoidObjPtr    inObj)
  2332. {
  2333.     MF3DNURBCurve2DObjPtr        writeObj;
  2334.     MF3DUns32                    numPoints;
  2335.     MF3DUns32                    order;
  2336.     MF3DUns32                    numKnots;
  2337.     MF3DErr                        result;
  2338.  
  2339.     MF3D_VerifyObjectType(inObj, kMF3DObjNURBCurve2D);
  2340.     writeObj = (MF3DNURBCurve2DObjPtr)inObj;
  2341.  
  2342.     result = kMF3DNoErr;
  2343.  
  2344.     order = writeObj->order;
  2345.     if (order < 2)
  2346.         result = kMF3DErrOrderTooSmall;
  2347.  
  2348.     if (result == kMF3DNoErr)
  2349.         result = MF3D_Uns32Write(inMetafilePtr, order);
  2350.  
  2351.     if (result == kMF3DNoErr)
  2352.         MF3D_CommentStrWrite(inMetafilePtr, "order");
  2353.  
  2354.     if (result == kMF3DNoErr)
  2355.     {    numPoints = writeObj->nPoints;
  2356.         if (numPoints < 2)
  2357.             result = kMF3DErrTooFewPoints;
  2358.     }
  2359.  
  2360.     if (result == kMF3DNoErr)
  2361.         result = MF3D_Uns32Write(inMetafilePtr, numPoints);
  2362.  
  2363.     if (result == kMF3DNoErr)
  2364.         MF3D_CommentStrWrite(inMetafilePtr, "nPoints");
  2365.  
  2366.     if (result == kMF3DNoErr)
  2367.     {    MF3DRationalPoint3DPtr    curPointPtr;
  2368.         MF3DUns32                pointNum;
  2369.  
  2370.         curPointPtr = writeObj->points;
  2371.         for (pointNum = 0;
  2372.                 result == kMF3DNoErr && pointNum < numPoints;
  2373.                 ++pointNum)
  2374.         {    result = MF3D_RationalPoint3DWrite(inMetafilePtr, *curPointPtr++);
  2375.             if (result == kMF3DNoErr)
  2376.                 MF3D_CommentNumWrite(inMetafilePtr, pointNum);
  2377.         }
  2378.     }
  2379.  
  2380.     if (result == kMF3DNoErr)
  2381.     {    MF3DKnotPtr        curKnotPtr;
  2382.         MF3DUns32        knotNum;
  2383.  
  2384.         MF3D_CommentStrWrite(inMetafilePtr, "knots");
  2385.  
  2386.         numKnots = numPoints + order;
  2387.  
  2388.         curKnotPtr = writeObj->knots;
  2389.         for (knotNum = 0; result == kMF3DNoErr && knotNum < numKnots; ++knotNum)
  2390.         {    result = MF3D_Float32Write(inMetafilePtr, *curKnotPtr++);
  2391.             if (result == kMF3DNoErr)
  2392.                 MF3D_CommentNumWrite(inMetafilePtr, knotNum);
  2393.         }
  2394.     }
  2395.  
  2396.     return result;
  2397. }
  2398.  
  2399. /*==============================================================================
  2400.  *    MF3D_ObjNURBCurve2DDisposer
  2401.  *==============================================================================
  2402.  */
  2403. MF3DErr
  2404. MF3D_ObjNURBCurve2DDisposer(
  2405.     MF3DVoidObjPtr    inObj)
  2406. {
  2407.     MF3D_VerifyObjectType(inObj, kMF3DObjNURBCurve2D);
  2408.  
  2409.     if (inObj != NULL)
  2410.     {    MF3D_Free(((MF3DNURBCurve2DObjPtr)inObj)->points);
  2411.         MF3D_Free(((MF3DNURBCurve2DObjPtr)inObj)->knots);
  2412.         MF3D_Free(inObj);
  2413.     }
  2414.     return kMF3DNoErr;
  2415. }
  2416.  
  2417. /*==============================================================================
  2418.  *    MF3D_ObjShaderDataReader
  2419.  *==============================================================================
  2420.  */
  2421. MF3DErr
  2422. MF3D_ObjShaderDataReader(
  2423.     MF3D_FilePtr    inMetafilePtr,
  2424.     MF3DVoidObjPtr    *outObj)
  2425. {
  2426.     MF3DShaderDataObjPtr        returnObj;
  2427.     MF3DErr                        result;
  2428.  
  2429.     result = kMF3DNoErr;
  2430.  
  2431.     MF3D_Allocate(returnObj);
  2432.  
  2433.     if (result == kMF3DNoErr)
  2434.     {    result = MF3D_EnumRead(inMetafilePtr, gMF3D_ShaderUVBoundaryEnum,
  2435.                 &returnObj->uBounds);
  2436.     }
  2437.  
  2438.     if (result == kMF3DNoErr)
  2439.     {    result = MF3D_EnumRead(inMetafilePtr, gMF3D_ShaderUVBoundaryEnum,
  2440.                 &returnObj->vBounds);
  2441.     }
  2442.  
  2443.     if (result == kMF3DNoErr)
  2444.         *outObj = (MF3DVoidObjPtr) returnObj;
  2445.     else
  2446.         MF3D_Free(returnObj);
  2447.  
  2448.     return result;
  2449. }
  2450.  
  2451. /*==============================================================================
  2452.  *    MF3D_ObjShaderDataWriter
  2453.  *==============================================================================
  2454.  */
  2455. MF3DErr
  2456. MF3D_ObjShaderDataWriter(
  2457.     MF3D_FilePtr    inMetafilePtr,
  2458.     MF3DVoidObjPtr    inObj)
  2459. {
  2460.     MF3DShaderDataObjPtr        writeObj;
  2461.     MF3DErr                        result;
  2462.  
  2463.     MF3D_VerifyObjectType(inObj, kMF3DObjShaderData);
  2464.     writeObj = (MF3DShaderDataObjPtr)inObj;
  2465.  
  2466.     result = MF3D_EnumWrite(inMetafilePtr, gMF3D_ShaderUVBoundaryEnum,
  2467.             writeObj->uBounds);
  2468.  
  2469.     if (result == kMF3DNoErr)
  2470.     {    result = MF3D_EnumWrite(inMetafilePtr, gMF3D_ShaderUVBoundaryEnum,
  2471.                 writeObj->vBounds);
  2472.     }
  2473.     return result;
  2474. }
  2475.  
  2476. /*==============================================================================
  2477.  *    MF3D_ObjShaderDataDisposer
  2478.  *==============================================================================
  2479.  */
  2480. MF3DErr
  2481. MF3D_ObjShaderDataDisposer(
  2482.     MF3DVoidObjPtr    inObj)
  2483. {
  2484.     MF3D_VerifyObjectType(inObj, kMF3DObjShaderData);
  2485.  
  2486.     MF3D_Free(inObj);
  2487.     return kMF3DNoErr;
  2488. }
  2489.  
  2490. /*==============================================================================
  2491.  *    MF3D_ObjShaderTransformReader
  2492.  *==============================================================================
  2493.  */
  2494. MF3DErr
  2495. MF3D_ObjShaderTransformReader(
  2496.     MF3D_FilePtr    inMetafilePtr,
  2497.     MF3DVoidObjPtr    *outObj)
  2498. {
  2499.     MF3DShaderTransformObjPtr    returnObj;
  2500.     MF3DErr                        result;
  2501.  
  2502.     result = kMF3DNoErr;
  2503.  
  2504.     MF3D_Allocate(returnObj);
  2505.  
  2506.     if (result == kMF3DNoErr)
  2507.     {    result = MF3D_Matrix4x4Read(inMetafilePtr, returnObj->shaderTransform);
  2508.     }
  2509.  
  2510.     if (result == kMF3DNoErr)
  2511.         *outObj = (MF3DVoidObjPtr) returnObj;
  2512.     else
  2513.         MF3D_Free(returnObj);
  2514.  
  2515.     return result;
  2516. }
  2517.  
  2518. /*==============================================================================
  2519.  *    MF3D_ObjShaderTransformWriter
  2520.  *==============================================================================
  2521.  */
  2522. MF3DErr
  2523. MF3D_ObjShaderTransformWriter(
  2524.     MF3D_FilePtr    inMetafilePtr,
  2525.     MF3DVoidObjPtr    inObj)
  2526. {
  2527.     MF3D_VerifyObjectType(inObj, kMF3DObjShaderTransform);
  2528.     MF3D_WriteNewLine(inMetafilePtr);
  2529.     return MF3D_Matrix4x4Write(inMetafilePtr,
  2530.             ((const MF3DShaderTransformObj *)inObj)->shaderTransform);
  2531. }
  2532.  
  2533. /*==============================================================================
  2534.  *    MF3D_ObjShaderTransformDisposer
  2535.  *==============================================================================
  2536.  */
  2537. MF3DErr
  2538. MF3D_ObjShaderTransformDisposer(
  2539.     MF3DVoidObjPtr    inObj)
  2540. {
  2541.     MF3D_VerifyObjectType(inObj, kMF3DObjShaderTransform);
  2542.  
  2543.     MF3D_Free(inObj);
  2544.     return kMF3DNoErr;
  2545. }
  2546.  
  2547. /*==============================================================================
  2548.  *    MF3D_ObjShaderUVTransformReader
  2549.  *==============================================================================
  2550.  */
  2551. MF3DErr
  2552. MF3D_ObjShaderUVTransformReader(
  2553.     MF3D_FilePtr    inMetafilePtr,
  2554.     MF3DVoidObjPtr    *outObj)
  2555. {
  2556.     MF3DShaderUVTransformObjPtr    returnObj;
  2557.     MF3DErr                        result;
  2558.  
  2559.     result = kMF3DNoErr;
  2560.  
  2561.     MF3D_Allocate(returnObj);
  2562.  
  2563.     if (result == kMF3DNoErr)
  2564.     {    result = MF3D_Matrix3x3Read(inMetafilePtr, returnObj->matrix);
  2565.     }
  2566.  
  2567.     if (result == kMF3DNoErr)
  2568.         *outObj = (MF3DVoidObjPtr) returnObj;
  2569.     else
  2570.         MF3D_Free(returnObj);
  2571.  
  2572.     return result;
  2573. }
  2574.  
  2575. /*==============================================================================
  2576.  *    MF3D_ObjShaderUVTransformWriter
  2577.  *==============================================================================
  2578.  */
  2579. MF3DErr
  2580. MF3D_ObjShaderUVTransformWriter(
  2581.     MF3D_FilePtr    inMetafilePtr,
  2582.     MF3DVoidObjPtr    inObj)
  2583. {
  2584.     MF3D_VerifyObjectType(inObj, kMF3DObjShaderUVTransform);
  2585.     MF3D_WriteNewLine(inMetafilePtr);
  2586.     return MF3D_Matrix3x3Write(inMetafilePtr,
  2587.             ((const MF3DShaderUVTransformObj *)inObj)->matrix);
  2588. }
  2589.  
  2590. /*==============================================================================
  2591.  *    MF3D_ObjShaderUVTransformDisposer
  2592.  *==============================================================================
  2593.  */
  2594. MF3DErr
  2595. MF3D_ObjShaderUVTransformDisposer(
  2596.     MF3DVoidObjPtr    inObj)
  2597. {
  2598.     MF3D_VerifyObjectType(inObj, kMF3DObjShaderUVTransform);
  2599.  
  2600.     MF3D_Free(inObj);
  2601.     return kMF3DNoErr;
  2602. }
  2603.  
  2604. /*==============================================================================
  2605.  *    MF3D_ObjTrimCurvesReader
  2606.  *==============================================================================
  2607.  */
  2608. MF3DErr
  2609. MF3D_ObjTrimCurvesReader(
  2610.     MF3D_FilePtr    inMetafilePtr,
  2611.     MF3DVoidObjPtr    *outObj)
  2612. {
  2613.     MF3DTrimCurvesObjPtr        returnObj;
  2614.     MF3DErr                        result;
  2615.  
  2616.     MF3D_Unused(inMetafilePtr);
  2617.     result = kMF3DNoErr;
  2618.  
  2619.     MF3D_Allocate(returnObj);
  2620.  
  2621.     if (result == kMF3DNoErr)
  2622.         *outObj = (MF3DVoidObjPtr) returnObj;
  2623.     else
  2624.         MF3D_Free(returnObj);
  2625.  
  2626.     return result;
  2627. }
  2628.  
  2629. /*==============================================================================
  2630.  *    MF3D_ObjTrimCurvesWriter
  2631.  *==============================================================================
  2632.  */
  2633. MF3DErr
  2634. MF3D_ObjTrimCurvesWriter(
  2635.     MF3D_FilePtr    inMetafilePtr,
  2636.     MF3DVoidObjPtr    inObj)
  2637. {
  2638.     MF3D_VerifyObjectType(inObj, kMF3DObjTrimCurves);
  2639.     MF3D_Unused(inMetafilePtr);
  2640.     MF3D_Unused(inObj);
  2641.     /* Nothing to write! */
  2642.     return kMF3DNoErr;
  2643. }
  2644.  
  2645. /*==============================================================================
  2646.  *    MF3D_ObjTrimCurvesDisposer
  2647.  *==============================================================================
  2648.  */
  2649. MF3DErr
  2650. MF3D_ObjTrimCurvesDisposer(
  2651.     MF3DVoidObjPtr    inObj)
  2652. {
  2653.     MF3D_VerifyObjectType(inObj, kMF3DObjTrimCurves);
  2654.  
  2655.     MF3D_Free(inObj);
  2656.     return kMF3DNoErr;
  2657. }
  2658.  
  2659. /*==============================================================================
  2660.  *    MF3D_ObjImageClearColorReader
  2661.  *==============================================================================
  2662.  */
  2663. MF3DErr
  2664. MF3D_ObjImageClearColorReader(
  2665.     MF3D_FilePtr    inMetafilePtr,
  2666.     MF3DVoidObjPtr    *outObj)
  2667. {
  2668.     MF3DImageClearColorObjPtr    returnObj;
  2669.     MF3DErr                        result;
  2670.  
  2671.     result = kMF3DNoErr;
  2672.  
  2673.     MF3D_Allocate(returnObj);
  2674.  
  2675.     if (result == kMF3DNoErr)
  2676.         result = MF3D_RGBColorRead(inMetafilePtr, &returnObj->clearColor);
  2677.  
  2678.     if (result == kMF3DNoErr)
  2679.         *outObj = (MF3DVoidObjPtr) returnObj;
  2680.     else
  2681.         MF3D_Free(returnObj);
  2682.  
  2683.     return result;
  2684. }
  2685.  
  2686. /*==============================================================================
  2687.  *    MF3D_ObjImageClearColorWriter
  2688.  *==============================================================================
  2689.  */
  2690. MF3DErr
  2691. MF3D_ObjImageClearColorWriter(
  2692.     MF3D_FilePtr    inMetafilePtr,
  2693.     MF3DVoidObjPtr    inObj)
  2694. {
  2695.     MF3D_VerifyObjectType(inObj, kMF3DObjImageClearColor);
  2696.     return MF3D_RGBColorWrite(inMetafilePtr,
  2697.             ((MF3DImageClearColorObjPtr)inObj)->clearColor);
  2698. }
  2699.  
  2700. /*==============================================================================
  2701.  *    MF3D_ObjImageClearColorDisposer
  2702.  *==============================================================================
  2703.  */
  2704. MF3DErr
  2705. MF3D_ObjImageClearColorDisposer(
  2706.     MF3DVoidObjPtr    inObj)
  2707. {
  2708.     MF3D_VerifyObjectType(inObj, kMF3DObjImageClearColor);
  2709.  
  2710.     MF3D_Free(inObj);
  2711.     return kMF3DNoErr;
  2712. }
  2713.  
  2714. /*==============================================================================
  2715.  *    MF3D_ObjImageDimensionsReader
  2716.  *==============================================================================
  2717.  */
  2718. MF3DErr
  2719. MF3D_ObjImageDimensionsReader(
  2720.     MF3D_FilePtr    inMetafilePtr,
  2721.     MF3DVoidObjPtr    *outObj)
  2722. {
  2723.     MF3DImageDimensionsObjPtr    returnObj;
  2724.     MF3DErr                        result;
  2725.  
  2726.     result = kMF3DNoErr;
  2727.  
  2728.     MF3D_Allocate(returnObj);
  2729.  
  2730.     if (result == kMF3DNoErr)
  2731.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->width);
  2732.  
  2733.     if (result == kMF3DNoErr)
  2734.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->height);
  2735.  
  2736.     if (result == kMF3DNoErr)
  2737.         *outObj = (MF3DVoidObjPtr) returnObj;
  2738.     else
  2739.         MF3D_Free(returnObj);
  2740.  
  2741.     return result;
  2742. }
  2743.  
  2744. /*==============================================================================
  2745.  *    MF3D_ObjImageDimensionsWriter
  2746.  *==============================================================================
  2747.  */
  2748. MF3DErr
  2749. MF3D_ObjImageDimensionsWriter(
  2750.     MF3D_FilePtr    inMetafilePtr,
  2751.     MF3DVoidObjPtr    inObj)
  2752. {
  2753.     MF3DImageDimensionsObjPtr    writeObj;
  2754.     MF3DErr                        result;
  2755.  
  2756.     MF3D_VerifyObjectType(inObj, kMF3DObjImageDimensions);
  2757.     writeObj = (MF3DImageDimensionsObjPtr)inObj;
  2758.  
  2759.     result = MF3D_Uns32Write(inMetafilePtr, writeObj->width);
  2760.  
  2761.     if (result == kMF3DNoErr)
  2762.         result = MF3D_Uns32Write(inMetafilePtr, writeObj->height);
  2763.  
  2764.     return result;
  2765. }
  2766.  
  2767. /*==============================================================================
  2768.  *    MF3D_ObjImageDimensionsDisposer
  2769.  *==============================================================================
  2770.  */
  2771. MF3DErr
  2772. MF3D_ObjImageDimensionsDisposer(
  2773.     MF3DVoidObjPtr    inObj)
  2774. {
  2775.     MF3D_VerifyObjectType(inObj, kMF3DObjImageDimensions);
  2776.  
  2777.     MF3D_Free(inObj);
  2778.     return kMF3DNoErr;
  2779. }
  2780.  
  2781. /*==============================================================================
  2782.  *    MF3D_ObjImageMaskReader
  2783.  *==============================================================================
  2784.  */
  2785. MF3DErr
  2786. MF3D_ObjImageMaskReader(
  2787.     MF3D_FilePtr    inMetafilePtr,
  2788.     MF3DVoidObjPtr    *outObj)
  2789. {
  2790.     MF3DImageMaskObjPtr            returnObj;
  2791.     MF3DUns32                    imageSize;
  2792.     MF3DErr                        result;
  2793.  
  2794.     result = kMF3DNoErr;
  2795.  
  2796.     MF3D_Allocate(returnObj);
  2797.  
  2798.     if (result == kMF3DNoErr)
  2799.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->width);
  2800.  
  2801.     if (result == kMF3DNoErr)
  2802.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->height);
  2803.  
  2804.     if (result == kMF3DNoErr)
  2805.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->rowBytes);
  2806.  
  2807.     if (result == kMF3DNoErr)
  2808.     {    imageSize = returnObj->height * returnObj->rowBytes;
  2809.  
  2810.         returnObj->image = MF3D_Malloc(imageSize);
  2811.         if (returnObj->image == NULL)
  2812.             result = kMF3DErrOutOfMemory;
  2813.     }
  2814.  
  2815.     if (result == kMF3DNoErr)
  2816.     {    result = MF3D_RawDataRead(inMetafilePtr, imageSize, returnObj->image);
  2817.         if (result != kMF3DNoErr)
  2818.             MF3D_Free(returnObj->image);
  2819.     }
  2820.  
  2821.     if (result == kMF3DNoErr)
  2822.         *outObj = (MF3DVoidObjPtr) returnObj;
  2823.     else
  2824.         MF3D_Free(returnObj);
  2825.  
  2826.     return result;
  2827. }
  2828.  
  2829. /*==============================================================================
  2830.  *    MF3D_ObjImageMaskWriter
  2831.  *==============================================================================
  2832.  */
  2833. MF3DErr
  2834. MF3D_ObjImageMaskWriter(
  2835.     MF3D_FilePtr    inMetafilePtr,
  2836.     MF3DVoidObjPtr    inObj)
  2837. {
  2838.     MF3DImageMaskObjPtr            writeObj;
  2839.     MF3DUns32                    imageSize;
  2840.     MF3DErr                        result;
  2841.  
  2842.     MF3D_VerifyObjectType(inObj, kMF3DObjImageMask);
  2843.     writeObj = (MF3DImageMaskObjPtr)inObj;
  2844.  
  2845.     MF3D_WriteNewLine(inMetafilePtr);
  2846.     result = MF3D_Uns32Write(inMetafilePtr, writeObj->width);
  2847.  
  2848.     if (result == kMF3DNoErr)
  2849.         result = MF3D_Uns32Write(inMetafilePtr, writeObj->height);
  2850.  
  2851.     if (result == kMF3DNoErr)
  2852.         result = MF3D_Uns32Write(inMetafilePtr, writeObj->rowBytes);
  2853.  
  2854.     if (result == kMF3DNoErr)
  2855.     {    imageSize = writeObj->height * writeObj->rowBytes;
  2856.         result = MF3D_RawDataWrite(inMetafilePtr, imageSize, writeObj->image);
  2857.     }
  2858.  
  2859.     return result;
  2860. }
  2861.  
  2862. /*==============================================================================
  2863.  *    MF3D_ObjImageMaskDisposer
  2864.  *==============================================================================
  2865.  */
  2866. MF3DErr
  2867. MF3D_ObjImageMaskDisposer(
  2868.     MF3DVoidObjPtr    inObj)
  2869. {
  2870.     MF3D_VerifyObjectType(inObj, kMF3DObjImageMask);
  2871.  
  2872.     if (inObj != NULL)
  2873.     {    MF3D_Free(((MF3DImageMaskObjPtr)inObj)->image);
  2874.         MF3D_Free(inObj);
  2875.     }
  2876.     return kMF3DNoErr;
  2877. }
  2878.  
  2879. #if defined(__COMPILING_ON_MACINTOSH__)
  2880. #pragma segment __OBJECTS_2__
  2881. #endif
  2882.  
  2883. /*==============================================================================
  2884.  *    MF3D_ObjAmbientCoefficientReader
  2885.  *==============================================================================
  2886.  */
  2887. MF3DErr
  2888. MF3D_ObjAmbientCoefficientReader(
  2889.     MF3D_FilePtr    inMetafilePtr,
  2890.     MF3DVoidObjPtr    *outObj)
  2891. {
  2892.     MF3DAmbientCoefficientObjPtr    returnObj;
  2893.     MF3DErr                        result;
  2894.  
  2895.     result = kMF3DNoErr;
  2896.  
  2897.     MF3D_Allocate(returnObj);
  2898.  
  2899.     if (result == kMF3DNoErr)
  2900.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->ambientCoefficent);
  2901.  
  2902.     if (result == kMF3DNoErr)
  2903.         *outObj = (MF3DVoidObjPtr) returnObj;
  2904.     else
  2905.         MF3D_Free(returnObj);
  2906.  
  2907.     return result;
  2908. }
  2909.  
  2910. /*==============================================================================
  2911.  *    MF3D_ObjAmbientCoefficientWriter
  2912.  *==============================================================================
  2913.  */
  2914. MF3DErr
  2915. MF3D_ObjAmbientCoefficientWriter(
  2916.     MF3D_FilePtr    inMetafilePtr,
  2917.     MF3DVoidObjPtr    inObj)
  2918. {
  2919.     MF3D_VerifyObjectType(inObj, kMF3DObjAmbientCoefficient);
  2920.  
  2921.     return MF3D_Float32Write(inMetafilePtr,
  2922.             ((MF3DAmbientCoefficientObjPtr)inObj)->ambientCoefficent);
  2923.  
  2924. }
  2925.  
  2926. /*==============================================================================
  2927.  *    MF3D_ObjAmbientCoefficientDisposer
  2928.  *==============================================================================
  2929.  */
  2930. MF3DErr
  2931. MF3D_ObjAmbientCoefficientDisposer(
  2932.     MF3DVoidObjPtr    inObj)
  2933. {
  2934.     MF3D_VerifyObjectType(inObj, kMF3DObjAmbientCoefficient);
  2935.  
  2936.     MF3D_Free(inObj);
  2937.     return kMF3DNoErr;
  2938. }
  2939.  
  2940. /*==============================================================================
  2941.  *    MF3D_ObjDiffuseColorReader
  2942.  *==============================================================================
  2943.  */
  2944. MF3DErr
  2945. MF3D_ObjDiffuseColorReader(
  2946.     MF3D_FilePtr    inMetafilePtr,
  2947.     MF3DVoidObjPtr    *outObj)
  2948. {
  2949.     MF3DDiffuseColorObjPtr        returnObj;
  2950.     MF3DErr                        result;
  2951.  
  2952.     result = kMF3DNoErr;
  2953.  
  2954.     MF3D_Allocate(returnObj);
  2955.  
  2956.     if (result == kMF3DNoErr)
  2957.         result = MF3D_RGBColorRead(inMetafilePtr, &returnObj->diffuseColor);
  2958.  
  2959.     if (result == kMF3DNoErr)
  2960.         *outObj = (MF3DVoidObjPtr) returnObj;
  2961.     else
  2962.         MF3D_Free(returnObj);
  2963.  
  2964.     return result;
  2965. }
  2966.  
  2967. /*==============================================================================
  2968.  *    MF3D_ObjDiffuseColorWriter
  2969.  *==============================================================================
  2970.  */
  2971. MF3DErr
  2972. MF3D_ObjDiffuseColorWriter(
  2973.     MF3D_FilePtr    inMetafilePtr,
  2974.     MF3DVoidObjPtr    inObj)
  2975. {
  2976.     MF3D_VerifyObjectType(inObj, kMF3DObjDiffuseColor);
  2977.     return MF3D_RGBColorWrite(inMetafilePtr,
  2978.             ((MF3DDiffuseColorObjPtr)inObj)->diffuseColor);
  2979. }
  2980.  
  2981. /*==============================================================================
  2982.  *    MF3D_ObjDiffuseColorDisposer
  2983.  *==============================================================================
  2984.  */
  2985. MF3DErr
  2986. MF3D_ObjDiffuseColorDisposer(
  2987.     MF3DVoidObjPtr    inObj)
  2988. {
  2989.     MF3D_VerifyObjectType(inObj, kMF3DObjDiffuseColor);
  2990.  
  2991.     MF3D_Free(inObj);
  2992.     return kMF3DNoErr;
  2993. }
  2994.  
  2995. /*==============================================================================
  2996.  *    MF3D_ObjHighlightStateReader
  2997.  *==============================================================================
  2998.  */
  2999. MF3DErr
  3000. MF3D_ObjHighlightStateReader(
  3001.     MF3D_FilePtr    inMetafilePtr,
  3002.     MF3DVoidObjPtr    *outObj)
  3003. {
  3004.     MF3DHighlightStateObjPtr    returnObj;
  3005.     MF3DErr                        result;
  3006.  
  3007.     result = kMF3DNoErr;
  3008.  
  3009.     MF3D_Allocate(returnObj);
  3010.  
  3011.     if (result == kMF3DNoErr)
  3012.         result = MF3D_BooleanRead(inMetafilePtr, &returnObj->highlighted);
  3013.  
  3014.     if (result == kMF3DNoErr)
  3015.         *outObj = (MF3DVoidObjPtr) returnObj;
  3016.     else
  3017.         MF3D_Free(returnObj);
  3018.  
  3019.     return result;
  3020. }
  3021.  
  3022. /*==============================================================================
  3023.  *    MF3D_ObjHighlightStateWriter
  3024.  *==============================================================================
  3025.  */
  3026. MF3DErr
  3027. MF3D_ObjHighlightStateWriter(
  3028.     MF3D_FilePtr    inMetafilePtr,
  3029.     MF3DVoidObjPtr    inObj)
  3030. {
  3031.     MF3D_VerifyObjectType(inObj, kMF3DObjHighlightState);
  3032.     return MF3D_BooleanWrite(inMetafilePtr,
  3033.             ((MF3DHighlightStateObjPtr)inObj)->highlighted);
  3034.  
  3035. }
  3036.  
  3037. /*==============================================================================
  3038.  *    MF3D_ObjHighlightStateDisposer
  3039.  *==============================================================================
  3040.  */
  3041. MF3DErr
  3042. MF3D_ObjHighlightStateDisposer(
  3043.     MF3DVoidObjPtr    inObj)
  3044. {
  3045.     MF3D_VerifyObjectType(inObj, kMF3DObjHighlightState);
  3046.  
  3047.     MF3D_Free(inObj);
  3048.     return kMF3DNoErr;
  3049. }
  3050.  
  3051. /*==============================================================================
  3052.  *    MF3D_ObjNormalReader
  3053.  *==============================================================================
  3054.  */
  3055. MF3DErr
  3056. MF3D_ObjNormalReader(
  3057.     MF3D_FilePtr    inMetafilePtr,
  3058.     MF3DVoidObjPtr    *outObj)
  3059. {
  3060.     MF3DNormalObjPtr            returnObj;
  3061.     MF3DErr                        result;
  3062.  
  3063.     result = kMF3DNoErr;
  3064.  
  3065.     MF3D_Allocate(returnObj);
  3066.  
  3067.     if (result == kMF3DNoErr)
  3068.         result = MF3D_Vector3DRead(inMetafilePtr, &returnObj->normal);
  3069.  
  3070.     if (result == kMF3DNoErr)
  3071.         *outObj = (MF3DVoidObjPtr) returnObj;
  3072.     else
  3073.         MF3D_Free(returnObj);
  3074.  
  3075.     return result;
  3076. }
  3077.  
  3078. /*==============================================================================
  3079.  *    MF3D_ObjNormalWriter
  3080.  *==============================================================================
  3081.  */
  3082. MF3DErr
  3083. MF3D_ObjNormalWriter(
  3084.     MF3D_FilePtr    inMetafilePtr,
  3085.     MF3DVoidObjPtr    inObj)
  3086. {
  3087.     MF3D_VerifyObjectType(inObj, kMF3DObjNormal);
  3088.     return MF3D_Vector3DWrite(inMetafilePtr, ((MF3DNormalObjPtr)inObj)->normal);
  3089. }
  3090.  
  3091. /*==============================================================================
  3092.  *    MF3D_ObjNormalDisposer
  3093.  *==============================================================================
  3094.  */
  3095. MF3DErr
  3096. MF3D_ObjNormalDisposer(
  3097.     MF3DVoidObjPtr    inObj)
  3098. {
  3099.     MF3D_VerifyObjectType(inObj, kMF3DObjNormal);
  3100.  
  3101.     MF3D_Free(inObj);
  3102.     return kMF3DNoErr;
  3103. }
  3104.  
  3105. /*==============================================================================
  3106.  *    MF3D_ObjShadingUVReader
  3107.  *==============================================================================
  3108.  */
  3109. MF3DErr
  3110. MF3D_ObjShadingUVReader(
  3111.     MF3D_FilePtr    inMetafilePtr,
  3112.     MF3DVoidObjPtr    *outObj)
  3113. {
  3114.     MF3DShadingUVObjPtr            returnObj;
  3115.     MF3DErr                        result;
  3116.  
  3117.     result = kMF3DNoErr;
  3118.  
  3119.     MF3D_Allocate(returnObj);
  3120.  
  3121.     if (result == kMF3DNoErr)
  3122.         result = MF3D_Param2DRead(inMetafilePtr, &returnObj->shadingUV);
  3123.  
  3124.     if (result == kMF3DNoErr)
  3125.         *outObj = (MF3DVoidObjPtr) returnObj;
  3126.     else
  3127.         MF3D_Free(returnObj);
  3128.  
  3129.     return result;
  3130. }
  3131.  
  3132. /*==============================================================================
  3133.  *    MF3D_ObjShadingUVWriter
  3134.  *==============================================================================
  3135.  */
  3136. MF3DErr
  3137. MF3D_ObjShadingUVWriter(
  3138.     MF3D_FilePtr    inMetafilePtr,
  3139.     MF3DVoidObjPtr    inObj)
  3140. {
  3141.     MF3D_VerifyObjectType(inObj, kMF3DObjShadingUV);
  3142.     return MF3D_Param2DWrite(inMetafilePtr,
  3143.             ((MF3DShadingUVObjPtr)inObj)->shadingUV);
  3144. }
  3145.  
  3146. /*==============================================================================
  3147.  *    MF3D_ObjShadingUVDisposer
  3148.  *==============================================================================
  3149.  */
  3150. MF3DErr
  3151. MF3D_ObjShadingUVDisposer(
  3152.     MF3DVoidObjPtr    inObj)
  3153. {
  3154.     MF3D_VerifyObjectType(inObj, kMF3DObjShadingUV);
  3155.  
  3156.     MF3D_Free(inObj);
  3157.     return kMF3DNoErr;
  3158. }
  3159.  
  3160. /*==============================================================================
  3161.  *    MF3D_ObjSpecularColorReader
  3162.  *==============================================================================
  3163.  */
  3164. MF3DErr
  3165. MF3D_ObjSpecularColorReader(
  3166.     MF3D_FilePtr    inMetafilePtr,
  3167.     MF3DVoidObjPtr    *outObj)
  3168. {
  3169.     MF3DSpecularColorObjPtr        returnObj;
  3170.     MF3DErr                        result;
  3171.  
  3172.     result = kMF3DNoErr;
  3173.  
  3174.     MF3D_Allocate(returnObj);
  3175.  
  3176.     if (result == kMF3DNoErr)
  3177.         result = MF3D_RGBColorRead(inMetafilePtr, &returnObj->specularColor);
  3178.  
  3179.     if (result == kMF3DNoErr)
  3180.         *outObj = (MF3DVoidObjPtr) returnObj;
  3181.     else
  3182.         MF3D_Free(returnObj);
  3183.  
  3184.     return result;
  3185. }
  3186.  
  3187. /*==============================================================================
  3188.  *    MF3D_ObjSpecularColorWriter
  3189.  *==============================================================================
  3190.  */
  3191. MF3DErr
  3192. MF3D_ObjSpecularColorWriter(
  3193.     MF3D_FilePtr    inMetafilePtr,
  3194.     MF3DVoidObjPtr    inObj)
  3195. {
  3196.     MF3D_VerifyObjectType(inObj, kMF3DObjSpecularColor);
  3197.     return MF3D_RGBColorWrite(inMetafilePtr,
  3198.             ((MF3DSpecularColorObjPtr)inObj)->specularColor);
  3199. }
  3200.  
  3201. /*==============================================================================
  3202.  *    MF3D_ObjSpecularColorDisposer
  3203.  *==============================================================================
  3204.  */
  3205. MF3DErr
  3206. MF3D_ObjSpecularColorDisposer(
  3207.     MF3DVoidObjPtr    inObj)
  3208. {
  3209.     MF3D_VerifyObjectType(inObj, kMF3DObjSpecularColor);
  3210.  
  3211.     MF3D_Free(inObj);
  3212.     return kMF3DNoErr;
  3213. }
  3214.  
  3215. /*==============================================================================
  3216.  *    MF3D_ObjSpecularControlReader
  3217.  *==============================================================================
  3218.  */
  3219. MF3DErr
  3220. MF3D_ObjSpecularControlReader(
  3221.     MF3D_FilePtr    inMetafilePtr,
  3222.     MF3DVoidObjPtr    *outObj)
  3223. {
  3224.     MF3DSpecularControlObjPtr    returnObj;
  3225.     MF3DErr                        result;
  3226.  
  3227.     result = kMF3DNoErr;
  3228.  
  3229.     MF3D_Allocate(returnObj);
  3230.  
  3231.     if (result == kMF3DNoErr)
  3232.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->specularControl);
  3233.  
  3234.     if (result == kMF3DNoErr)
  3235.         *outObj = (MF3DVoidObjPtr) returnObj;
  3236.     else
  3237.         MF3D_Free(returnObj);
  3238.  
  3239.     return result;
  3240. }
  3241.  
  3242. /*==============================================================================
  3243.  *    MF3D_ObjSpecularControlWriter
  3244.  *==============================================================================
  3245.  */
  3246. MF3DErr
  3247. MF3D_ObjSpecularControlWriter(
  3248.     MF3D_FilePtr    inMetafilePtr,
  3249.     MF3DVoidObjPtr    inObj)
  3250. {
  3251.     MF3D_VerifyObjectType(inObj, kMF3DObjSpecularControl);
  3252.     return MF3D_Float32Write(inMetafilePtr,
  3253.             ((MF3DSpecularControlObjPtr)inObj)->specularControl);
  3254. }
  3255.  
  3256. /*==============================================================================
  3257.  *    MF3D_ObjSpecularControlDisposer
  3258.  *==============================================================================
  3259.  */
  3260. MF3DErr
  3261. MF3D_ObjSpecularControlDisposer(
  3262.     MF3DVoidObjPtr    inObj)
  3263. {
  3264.     MF3D_VerifyObjectType(inObj, kMF3DObjSpecularControl);
  3265.  
  3266.     MF3D_Free(inObj);
  3267.     return kMF3DNoErr;
  3268. }
  3269.  
  3270. /*==============================================================================
  3271.  *    MF3D_ObjSurfaceTangentReader
  3272.  *==============================================================================
  3273.  */
  3274. MF3DErr
  3275. MF3D_ObjSurfaceTangentReader(
  3276.     MF3D_FilePtr    inMetafilePtr,
  3277.     MF3DVoidObjPtr    *outObj)
  3278. {
  3279.     MF3DSurfaceTangentObjPtr    returnObj;
  3280.     MF3DErr                        result;
  3281.  
  3282.     result = kMF3DNoErr;
  3283.  
  3284.     MF3D_Allocate(returnObj);
  3285.  
  3286.     if (result == kMF3DNoErr)
  3287.         result = MF3D_Vector3DRead(inMetafilePtr, &returnObj->paramU);
  3288.  
  3289.     if (result == kMF3DNoErr)
  3290.         result = MF3D_Vector3DRead(inMetafilePtr, &returnObj->paramV);
  3291.  
  3292.     if (result == kMF3DNoErr)
  3293.         *outObj = (MF3DVoidObjPtr) returnObj;
  3294.     else
  3295.         MF3D_Free(returnObj);
  3296.  
  3297.     return result;
  3298. }
  3299.  
  3300. /*==============================================================================
  3301.  *    MF3D_ObjSurfaceTangentWriter
  3302.  *==============================================================================
  3303.  */
  3304. MF3DErr
  3305. MF3D_ObjSurfaceTangentWriter(
  3306.     MF3D_FilePtr    inMetafilePtr,
  3307.     MF3DVoidObjPtr    inObj)
  3308. {
  3309.     MF3DSurfaceTangentObjPtr    writeObj;
  3310.     MF3DErr                        result;
  3311.     
  3312.     MF3D_VerifyObjectType(inObj, kMF3DObjSurfaceTangent);
  3313.     writeObj = (MF3DSurfaceTangentObjPtr)inObj;
  3314.  
  3315.     result = MF3D_Vector3DWrite(inMetafilePtr, writeObj->paramU);
  3316.  
  3317.     if (result == kMF3DNoErr)
  3318.         result = MF3D_Vector3DWrite(inMetafilePtr, writeObj->paramV);
  3319.  
  3320.     return result;
  3321. }
  3322.  
  3323. /*==============================================================================
  3324.  *    MF3D_ObjSurfaceTangentDisposer
  3325.  *==============================================================================
  3326.  */
  3327. MF3DErr
  3328. MF3D_ObjSurfaceTangentDisposer(
  3329.     MF3DVoidObjPtr    inObj)
  3330. {
  3331.     MF3D_VerifyObjectType(inObj, kMF3DObjSurfaceTangent);
  3332.  
  3333.     MF3D_Free(inObj);
  3334.     return kMF3DNoErr;
  3335. }
  3336.  
  3337. /*==============================================================================
  3338.  *    MF3D_ObjSurfaceUVReader
  3339.  *==============================================================================
  3340.  */
  3341. MF3DErr
  3342. MF3D_ObjSurfaceUVReader(
  3343.     MF3D_FilePtr    inMetafilePtr,
  3344.     MF3DVoidObjPtr    *outObj)
  3345. {
  3346.     MF3DSurfaceUVObjPtr            returnObj;
  3347.     MF3DErr                        result;
  3348.  
  3349.     result = kMF3DNoErr;
  3350.  
  3351.     MF3D_Allocate(returnObj);
  3352.  
  3353.     if (result == kMF3DNoErr)
  3354.         result = MF3D_Param2DRead(inMetafilePtr, &returnObj->surfaceUV);
  3355.  
  3356.     if (result == kMF3DNoErr)
  3357.         *outObj = (MF3DVoidObjPtr) returnObj;
  3358.     else
  3359.         MF3D_Free(returnObj);
  3360.  
  3361.     return result;
  3362. }
  3363.  
  3364. /*==============================================================================
  3365.  *    MF3D_ObjSurfaceUVWriter
  3366.  *==============================================================================
  3367.  */
  3368. MF3DErr
  3369. MF3D_ObjSurfaceUVWriter(
  3370.     MF3D_FilePtr    inMetafilePtr,
  3371.     MF3DVoidObjPtr    inObj)
  3372. {
  3373.     MF3D_VerifyObjectType(inObj, kMF3DObjSurfaceUV);
  3374.     return MF3D_Param2DWrite(inMetafilePtr,
  3375.             ((MF3DSurfaceUVObjPtr)inObj)->surfaceUV);
  3376. }
  3377.  
  3378. /*==============================================================================
  3379.  *    MF3D_ObjSurfaceUVDisposer
  3380.  *==============================================================================
  3381.  */
  3382. MF3DErr
  3383. MF3D_ObjSurfaceUVDisposer(
  3384.     MF3DVoidObjPtr    inObj)
  3385. {
  3386.     MF3D_VerifyObjectType(inObj, kMF3DObjSurfaceUV);
  3387.  
  3388.     MF3D_Free(inObj);
  3389.     return kMF3DNoErr;
  3390. }
  3391.  
  3392. /*==============================================================================
  3393.  *    MF3D_ObjTransparencyColorReader
  3394.  *==============================================================================
  3395.  */
  3396. MF3DErr
  3397. MF3D_ObjTransparencyColorReader(
  3398.     MF3D_FilePtr    inMetafilePtr,
  3399.     MF3DVoidObjPtr    *outObj)
  3400. {
  3401.     MF3DTransparencyColorObjPtr    returnObj;
  3402.     MF3DErr                        result;
  3403.  
  3404.     result = kMF3DNoErr;
  3405.  
  3406.     MF3D_Allocate(returnObj);
  3407.  
  3408.     if (result == kMF3DNoErr)
  3409.         result = MF3D_RGBColorRead(inMetafilePtr, &returnObj->transparency);
  3410.  
  3411.     if (result == kMF3DNoErr)
  3412.         *outObj = (MF3DVoidObjPtr) returnObj;
  3413.     else
  3414.         MF3D_Free(returnObj);
  3415.  
  3416.     return result;
  3417. }
  3418.  
  3419. /*==============================================================================
  3420.  *    MF3D_ObjTransparencyColorWriter
  3421.  *==============================================================================
  3422.  */
  3423. MF3DErr
  3424. MF3D_ObjTransparencyColorWriter(
  3425.     MF3D_FilePtr    inMetafilePtr,
  3426.     MF3DVoidObjPtr    inObj)
  3427. {
  3428.     MF3D_VerifyObjectType(inObj, kMF3DObjTransparencyColor);
  3429.     return MF3D_RGBColorWrite(inMetafilePtr,
  3430.             ((MF3DTransparencyColorObjPtr)inObj)->transparency);
  3431. }
  3432.  
  3433. /*==============================================================================
  3434.  *    MF3D_ObjTransparencyColorDisposer
  3435.  *==============================================================================
  3436.  */
  3437. MF3DErr
  3438. MF3D_ObjTransparencyColorDisposer(
  3439.     MF3DVoidObjPtr    inObj)
  3440. {
  3441.     MF3D_VerifyObjectType(inObj, kMF3DObjTransparencyColor);
  3442.  
  3443.     MF3D_Free(inObj);
  3444.     return kMF3DNoErr;
  3445. }
  3446.  
  3447. /*==============================================================================
  3448.  *    MF3D_ObjRendererInteractiveReader
  3449.  *==============================================================================
  3450.  */
  3451. MF3DErr
  3452. MF3D_ObjRendererInteractiveReader(
  3453.     MF3D_FilePtr    inMetafilePtr,
  3454.     MF3DVoidObjPtr    *outObj)
  3455. {
  3456.     MF3DInteractiveRendererObjPtr    returnObj;
  3457.     MF3DErr                            result;
  3458.  
  3459.     MF3D_Unused(inMetafilePtr);
  3460.     result = kMF3DNoErr;
  3461.  
  3462.     MF3D_Allocate(returnObj);
  3463.  
  3464.     if (result == kMF3DNoErr)
  3465.         *outObj = (MF3DVoidObjPtr) returnObj;
  3466.     else
  3467.         MF3D_Free(returnObj);
  3468.  
  3469.     return result;
  3470. }
  3471.  
  3472. /*==============================================================================
  3473.  *    MF3D_ObjRendererInteractiveWriter
  3474.  *==============================================================================
  3475.  */
  3476. MF3DErr
  3477. MF3D_ObjRendererInteractiveWriter(
  3478.     MF3D_FilePtr    inMetafilePtr,
  3479.     MF3DVoidObjPtr    inObj)
  3480. {
  3481.     MF3D_VerifyObjectType(inObj, kMF3DObjRendererInteractive);
  3482.     MF3D_Unused(inMetafilePtr);
  3483.     MF3D_Unused(inObj);
  3484.     /* Nothing to write! */
  3485.     return kMF3DNoErr;
  3486. }
  3487.  
  3488. /*==============================================================================
  3489.  *    MF3D_ObjRendererInteractiveDisposer
  3490.  *==============================================================================
  3491.  */
  3492. MF3DErr
  3493. MF3D_ObjRendererInteractiveDisposer(
  3494.     MF3DVoidObjPtr    inObj)
  3495. {
  3496.     MF3D_VerifyObjectType(inObj, kMF3DObjRendererInteractive);
  3497.  
  3498.     MF3D_Free(inObj);
  3499.     return kMF3DNoErr;
  3500. }
  3501.  
  3502. /*==============================================================================
  3503.  *    MF3D_ObjRendererGenericReader
  3504.  *==============================================================================
  3505.  */
  3506. MF3DErr
  3507. MF3D_ObjRendererGenericReader(
  3508.     MF3D_FilePtr    inMetafilePtr,
  3509.     MF3DVoidObjPtr    *outObj)
  3510. {
  3511.     MF3DGenericRendererObjPtr    returnObj;
  3512.     MF3DErr                        result;
  3513.  
  3514.     MF3D_Unused(inMetafilePtr);
  3515.     result = kMF3DNoErr;
  3516.  
  3517.     MF3D_Allocate(returnObj);
  3518.  
  3519.     if (result == kMF3DNoErr)
  3520.         *outObj = (MF3DVoidObjPtr) returnObj;
  3521.     else
  3522.         MF3D_Free(returnObj);
  3523.  
  3524.     return result;
  3525. }
  3526.  
  3527. /*==============================================================================
  3528.  *    MF3D_ObjRendererGenericWriter
  3529.  *==============================================================================
  3530.  */
  3531. MF3DErr
  3532. MF3D_ObjRendererGenericWriter(
  3533.     MF3D_FilePtr    inMetafilePtr,
  3534.     MF3DVoidObjPtr    inObj)
  3535. {
  3536.     MF3D_VerifyObjectType(inObj, kMF3DObjRendererGeneric);
  3537.     MF3D_Unused(inMetafilePtr);
  3538.     MF3D_Unused(inObj);
  3539.     /* Nothing to write! */
  3540.     return kMF3DNoErr;
  3541. }
  3542.  
  3543. /*==============================================================================
  3544.  *    MF3D_ObjRendererGenericDisposer
  3545.  *==============================================================================
  3546.  */
  3547. MF3DErr
  3548. MF3D_ObjRendererGenericDisposer(
  3549.     MF3DVoidObjPtr    inObj)
  3550. {
  3551.     MF3D_VerifyObjectType(inObj, kMF3DObjRendererGeneric);
  3552.  
  3553.     MF3D_Free(inObj);
  3554.     return kMF3DNoErr;
  3555. }
  3556.  
  3557. /*==============================================================================
  3558.  *    MF3D_ObjRendererWireFrameReader
  3559.  *==============================================================================
  3560.  */
  3561. MF3DErr
  3562. MF3D_ObjRendererWireFrameReader(
  3563.     MF3D_FilePtr    inMetafilePtr,
  3564.     MF3DVoidObjPtr    *outObj)
  3565. {
  3566.     MF3DWireFrameObjPtr    returnObj;
  3567.     MF3DErr                        result;
  3568.  
  3569.     MF3D_Unused(inMetafilePtr);
  3570.     result = kMF3DNoErr;
  3571.  
  3572.     MF3D_Allocate(returnObj);
  3573.  
  3574.     if (result == kMF3DNoErr)
  3575.         *outObj = (MF3DVoidObjPtr) returnObj;
  3576.     else
  3577.         MF3D_Free(returnObj);
  3578.  
  3579.     return result;
  3580. }
  3581.  
  3582. /*==============================================================================
  3583.  *    MF3D_ObjRendererWireFrameWriter
  3584.  *==============================================================================
  3585.  */
  3586. MF3DErr
  3587. MF3D_ObjRendererWireFrameWriter(
  3588.     MF3D_FilePtr    inMetafilePtr,
  3589.     MF3DVoidObjPtr    inObj)
  3590. {
  3591.     MF3D_VerifyObjectType(inObj, kMF3DObjRendererWireFrame);
  3592.     MF3D_Unused(inMetafilePtr);
  3593.     MF3D_Unused(inObj);
  3594.     /* Nothing to write! */
  3595.     return kMF3DNoErr;
  3596. }
  3597.  
  3598. /*==============================================================================
  3599.  *    MF3D_ObjRendererWireFrameDisposer
  3600.  *==============================================================================
  3601.  */
  3602. MF3DErr
  3603. MF3D_ObjRendererWireFrameDisposer(
  3604.     MF3DVoidObjPtr    inObj)
  3605. {
  3606.     MF3D_VerifyObjectType(inObj, kMF3DObjRendererWireFrame);
  3607.  
  3608.     MF3D_Free(inObj);
  3609.     return kMF3DNoErr;
  3610. }
  3611.  
  3612. /*==============================================================================
  3613.  *    MF3D_ObjRendererZBufferReader
  3614.  *==============================================================================
  3615.  */
  3616. MF3DErr
  3617. MF3D_ObjRendererZBufferReader(
  3618.     MF3D_FilePtr    inMetafilePtr,
  3619.     MF3DVoidObjPtr    *outObj)
  3620. {
  3621.     MF3DZBufferObjPtr    returnObj;
  3622.     MF3DErr                        result;
  3623.  
  3624.     MF3D_Unused(inMetafilePtr);
  3625.     result = kMF3DNoErr;
  3626.  
  3627.     MF3D_Allocate(returnObj);
  3628.  
  3629.     if (result == kMF3DNoErr)
  3630.         *outObj = (MF3DVoidObjPtr) returnObj;
  3631.     else
  3632.         MF3D_Free(returnObj);
  3633.  
  3634.     return result;
  3635. }
  3636.  
  3637. /*==============================================================================
  3638.  *    MF3D_ObjRendererZBufferWriter
  3639.  *==============================================================================
  3640.  */
  3641. MF3DErr
  3642. MF3D_ObjRendererZBufferWriter(
  3643.     MF3D_FilePtr    inMetafilePtr,
  3644.     MF3DVoidObjPtr    inObj)
  3645. {
  3646.     MF3D_VerifyObjectType(inObj, kMF3DObjRendererZBuffer);
  3647.     MF3D_Unused(inMetafilePtr);
  3648.     MF3D_Unused(inObj);
  3649.     /* Nothing to write! */
  3650.     return kMF3DNoErr;
  3651. }
  3652.  
  3653. /*==============================================================================
  3654.  *    MF3D_ObjRendererZBufferDisposer
  3655.  *==============================================================================
  3656.  */
  3657. MF3DErr
  3658. MF3D_ObjRendererZBufferDisposer(
  3659.     MF3DVoidObjPtr    inObj)
  3660. {
  3661.     MF3D_VerifyObjectType(inObj, kMF3DObjRendererZBuffer);
  3662.  
  3663.     MF3D_Free(inObj);
  3664.     return kMF3DNoErr;
  3665. }
  3666.  
  3667. /*==============================================================================
  3668.  *    MF3D_ObjAttributeSetReader
  3669.  *==============================================================================
  3670.  */
  3671. MF3DErr
  3672. MF3D_ObjAttributeSetReader(
  3673.     MF3D_FilePtr    inMetafilePtr,
  3674.     MF3DVoidObjPtr    *outObj)
  3675. {
  3676.     MF3DAttributeSetObjPtr        returnObj;
  3677.     MF3DErr                        result;
  3678.  
  3679.     MF3D_Unused(inMetafilePtr);
  3680.     result = kMF3DNoErr;
  3681.  
  3682.     MF3D_Allocate(returnObj);
  3683.  
  3684.     if (result == kMF3DNoErr)
  3685.         *outObj = (MF3DVoidObjPtr) returnObj;
  3686.     else
  3687.         MF3D_Free(returnObj);
  3688.  
  3689.     return result;
  3690. }
  3691.  
  3692.  
  3693. /*==============================================================================
  3694.  *    MF3D_ObjAttributeSetWriter
  3695.  *==============================================================================
  3696.  */
  3697. MF3DErr
  3698. MF3D_ObjAttributeSetWriter(
  3699.     MF3D_FilePtr    inMetafilePtr,
  3700.     MF3DVoidObjPtr    inObj)
  3701. {
  3702.     MF3D_VerifyObjectType(inObj, kMF3DObjAttributeSet);
  3703.     MF3D_Unused(inMetafilePtr);
  3704.     MF3D_Unused(inObj);
  3705.     /* Nothing to write! */
  3706.     return kMF3DNoErr;
  3707. }
  3708.  
  3709. /*==============================================================================
  3710.  *    MF3D_ObjAttributeSetDisposer
  3711.  *==============================================================================
  3712.  */
  3713. MF3DErr
  3714. MF3D_ObjAttributeSetDisposer(
  3715.     MF3DVoidObjPtr    inObj)
  3716. {
  3717.     MF3D_VerifyObjectType(inObj, kMF3DObjAttributeSet);
  3718.  
  3719.     MF3D_Free(inObj);
  3720.     return kMF3DNoErr;
  3721. }
  3722.  
  3723. /*==============================================================================
  3724.  *    MF3D_ObjOrthographicCameraReader
  3725.  *==============================================================================
  3726.  */
  3727. MF3DErr
  3728. MF3D_ObjOrthographicCameraReader(
  3729.     MF3D_FilePtr    inMetafilePtr,
  3730.     MF3DVoidObjPtr    *outObj)
  3731. {
  3732.     MF3DOrthographicCameraObjPtr    returnObj;
  3733.     MF3DErr                            result;
  3734.  
  3735.     result = kMF3DNoErr;
  3736.  
  3737.     MF3D_Allocate(returnObj);
  3738.  
  3739.     if (result == kMF3DNoErr)
  3740.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->left);
  3741.  
  3742.     if (result == kMF3DNoErr)
  3743.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->top);
  3744.  
  3745.     if (result == kMF3DNoErr)
  3746.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->right);
  3747.  
  3748.     if (result == kMF3DNoErr)
  3749.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->bottom);
  3750.  
  3751.     if (result == kMF3DNoErr)
  3752.         *outObj = (MF3DVoidObjPtr) returnObj;
  3753.     else
  3754.         MF3D_Free(returnObj);
  3755.  
  3756.     return result;
  3757. }
  3758.  
  3759.  
  3760. /*==============================================================================
  3761.  *    MF3D_ObjOrthographicCameraWriter
  3762.  *==============================================================================
  3763.  */
  3764. MF3DErr
  3765. MF3D_ObjOrthographicCameraWriter(
  3766.     MF3D_FilePtr    inMetafilePtr,
  3767.     MF3DVoidObjPtr    inObj)
  3768. {
  3769.     MF3DOrthographicCameraObjPtr    writeObj;
  3770.     MF3DErr                            result;
  3771.  
  3772.     MF3D_VerifyObjectType(inObj, kMF3DObjOrthographicCamera);
  3773.     writeObj = (MF3DOrthographicCameraObjPtr)inObj;
  3774.  
  3775.     result = MF3D_Float32Write(inMetafilePtr, writeObj->left);
  3776.  
  3777.     if (result == kMF3DNoErr)
  3778.         result = MF3D_Float32Write(inMetafilePtr, writeObj->top);
  3779.  
  3780.     if (result == kMF3DNoErr)
  3781.         result = MF3D_Float32Write(inMetafilePtr, writeObj->right);
  3782.  
  3783.     if (result == kMF3DNoErr)
  3784.         result = MF3D_Float32Write(inMetafilePtr, writeObj->bottom);
  3785.  
  3786.     return result;
  3787. }
  3788.  
  3789. /*==============================================================================
  3790.  *    MF3D_ObjOrthographicCameraDisposer
  3791.  *==============================================================================
  3792.  */
  3793. MF3DErr
  3794. MF3D_ObjOrthographicCameraDisposer(
  3795.     MF3DVoidObjPtr    inObj)
  3796. {
  3797.     MF3D_VerifyObjectType(inObj, kMF3DObjOrthographicCamera);
  3798.  
  3799.     MF3D_Free(inObj);
  3800.     return kMF3DNoErr;
  3801. }
  3802.  
  3803. /*==============================================================================
  3804.  *    MF3D_ObjViewAngleAspectCameraReader
  3805.  *==============================================================================
  3806.  */
  3807. MF3DErr
  3808. MF3D_ObjViewAngleAspectCameraReader(
  3809.     MF3D_FilePtr    inMetafilePtr,
  3810.     MF3DVoidObjPtr    *outObj)
  3811. {
  3812.     MF3DViewAngleAspectCameraObjPtr    returnObj;
  3813.     MF3DErr                            result;
  3814.  
  3815.     result = kMF3DNoErr;
  3816.  
  3817.     MF3D_Allocate(returnObj);
  3818.  
  3819.     if (result == kMF3DNoErr)
  3820.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->fieldOfView);
  3821.  
  3822.     if (result == kMF3DNoErr)
  3823.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->aspectRatioXtoY);
  3824.  
  3825.     if (result == kMF3DNoErr)
  3826.         *outObj = (MF3DVoidObjPtr) returnObj;
  3827.     else
  3828.         MF3D_Free(returnObj);
  3829.  
  3830.     return result;
  3831. }
  3832.  
  3833.  
  3834. /*==============================================================================
  3835.  *    MF3D_ObjViewAngleAspectCameraWriter
  3836.  *==============================================================================
  3837.  */
  3838. MF3DErr
  3839. MF3D_ObjViewAngleAspectCameraWriter(
  3840.     MF3D_FilePtr    inMetafilePtr,
  3841.     MF3DVoidObjPtr    inObj)
  3842. {
  3843.     MF3DViewAngleAspectCameraObjPtr    writeObj;
  3844.     MF3DErr                            result;
  3845.  
  3846.     MF3D_VerifyObjectType(inObj, kMF3DObjViewAngleAspectCamera);
  3847.     writeObj = (MF3DViewAngleAspectCameraObjPtr)inObj;
  3848.  
  3849.     result = MF3D_Float32Write(inMetafilePtr, writeObj->fieldOfView);
  3850.  
  3851.     if (result == kMF3DNoErr)
  3852.         result = MF3D_Float32Write(inMetafilePtr, writeObj->aspectRatioXtoY);
  3853.  
  3854.     return result;
  3855. }
  3856.  
  3857. /*==============================================================================
  3858.  *    MF3D_ObjViewAngleAspectCameraDisposer
  3859.  *==============================================================================
  3860.  */
  3861. MF3DErr
  3862. MF3D_ObjViewAngleAspectCameraDisposer(
  3863.     MF3DVoidObjPtr    inObj)
  3864. {
  3865.     MF3D_VerifyObjectType(inObj, kMF3DObjViewAngleAspectCamera);
  3866.  
  3867.     MF3D_Free(inObj);
  3868.     return kMF3DNoErr;
  3869. }
  3870.  
  3871. /*==============================================================================
  3872.  *    MF3D_ObjViewPlaneCameraReader
  3873.  *==============================================================================
  3874.  */
  3875. MF3DErr
  3876. MF3D_ObjViewPlaneCameraReader(
  3877.     MF3D_FilePtr    inMetafilePtr,
  3878.     MF3DVoidObjPtr    *outObj)
  3879. {
  3880.     MF3DViewPlaneCameraObjPtr    returnObj;
  3881.     MF3DErr                        result;
  3882.  
  3883.     result = kMF3DNoErr;
  3884.  
  3885.     MF3D_Allocate(returnObj);
  3886.  
  3887.     if (result == kMF3DNoErr)
  3888.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->viewPlane);
  3889.  
  3890.     if (result == kMF3DNoErr)
  3891.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->halfWidthAtViewPlane);
  3892.  
  3893.     if (result == kMF3DNoErr)
  3894.     {    result = MF3D_Float32Read(inMetafilePtr,
  3895.                 &returnObj->halfHeightAtViewPlane);
  3896.     }
  3897.  
  3898.     if (result == kMF3DNoErr)
  3899.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->centerXOnViewPlane);
  3900.  
  3901.     if (result == kMF3DNoErr)
  3902.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->centerYOnViewPlane);
  3903.  
  3904.     if (result == kMF3DNoErr)
  3905.         *outObj = (MF3DVoidObjPtr) returnObj;
  3906.     else
  3907.         MF3D_Free(returnObj);
  3908.  
  3909.     return result;
  3910. }
  3911.  
  3912.  
  3913. /*==============================================================================
  3914.  *    MF3D_ObjViewPlaneCameraWriter
  3915.  *==============================================================================
  3916.  */
  3917. MF3DErr
  3918. MF3D_ObjViewPlaneCameraWriter(
  3919.     MF3D_FilePtr    inMetafilePtr,
  3920.     MF3DVoidObjPtr    inObj)
  3921. {
  3922.     MF3DViewPlaneCameraObjPtr    writeObj;
  3923.     MF3DErr                        result;
  3924.  
  3925.     MF3D_VerifyObjectType(inObj, kMF3DObjViewPlaneCamera);
  3926.     writeObj = (MF3DViewPlaneCameraObjPtr)inObj;
  3927.  
  3928.     result = MF3D_Float32Write(inMetafilePtr, writeObj->viewPlane);
  3929.  
  3930.     if (result == kMF3DNoErr)
  3931.     {    result = MF3D_Float32Write(inMetafilePtr,
  3932.                 writeObj->halfWidthAtViewPlane);
  3933.     }
  3934.  
  3935.     if (result == kMF3DNoErr)
  3936.     {    result = MF3D_Float32Write(inMetafilePtr,
  3937.                 writeObj->halfHeightAtViewPlane);
  3938.     }
  3939.  
  3940.     if (result == kMF3DNoErr)
  3941.         result = MF3D_Float32Write(inMetafilePtr, writeObj->centerXOnViewPlane);
  3942.  
  3943.     if (result == kMF3DNoErr)
  3944.         result = MF3D_Float32Write(inMetafilePtr, writeObj->centerYOnViewPlane);
  3945.  
  3946.     return result;
  3947. }
  3948.  
  3949. /*==============================================================================
  3950.  *    MF3D_ObjViewPlaneCameraDisposer
  3951.  *==============================================================================
  3952.  */
  3953. MF3DErr
  3954. MF3D_ObjViewPlaneCameraDisposer(
  3955.     MF3DVoidObjPtr    inObj)
  3956. {
  3957.     MF3D_VerifyObjectType(inObj, kMF3DObjViewPlaneCamera);
  3958.  
  3959.     MF3D_Free(inObj);
  3960.     return kMF3DNoErr;
  3961. }
  3962.  
  3963. /*==============================================================================
  3964.  *    MF3D_ObjBoxReader
  3965.  *==============================================================================
  3966.  */
  3967. MF3DErr
  3968. MF3D_ObjBoxReader(
  3969.     MF3D_FilePtr    inMetafilePtr,
  3970.     MF3DVoidObjPtr    *outObj)
  3971. {
  3972.     MF3DBoxObjPtr            returnObj;
  3973.     MF3DVector3D            vector;
  3974.     MF3DErr                    numberExists;
  3975.     MF3DErr                    result;
  3976.  
  3977.     result = kMF3DNoErr;
  3978.  
  3979.     MF3D_Allocate(returnObj);
  3980.  
  3981.     if (result == kMF3DNoErr)
  3982.     {    returnObj->box = NULL;
  3983.  
  3984.         numberExists = MF3D_Vector3DRead(inMetafilePtr, &vector);
  3985.     }
  3986.  
  3987.     if (result == kMF3DNoErr && numberExists == kMF3DNoErr)
  3988.     {    MF3D_Allocate(returnObj->box);
  3989.  
  3990.         returnObj->box->orientation.x = vector.x;
  3991.         returnObj->box->orientation.y = vector.y;
  3992.         returnObj->box->orientation.z = vector.z;
  3993.  
  3994.         if (result == kMF3DNoErr)
  3995.         {    result = MF3D_Vector3DRead(inMetafilePtr,
  3996.                     &returnObj->box->majorAxis);
  3997.         }
  3998.  
  3999.         if (result == kMF3DNoErr)
  4000.         {    result = MF3D_Vector3DRead(inMetafilePtr,
  4001.                     &returnObj->box->minorAxis);
  4002.         }
  4003.  
  4004.         if (result == kMF3DNoErr)
  4005.             result = MF3D_Point3DRead(inMetafilePtr, &returnObj->box->origin);
  4006.     }
  4007.  
  4008.     if (result == kMF3DNoErr)
  4009.         *outObj = (MF3DVoidObjPtr) returnObj;
  4010.     else
  4011.         MF3D_Free(returnObj);
  4012.  
  4013.     return result;
  4014. }
  4015.  
  4016.  
  4017. /*==============================================================================
  4018.  *    MF3D_ObjBoxWriter
  4019.  *==============================================================================
  4020.  */
  4021. MF3DErr
  4022. MF3D_ObjBoxWriter(
  4023.     MF3D_FilePtr    inMetafilePtr,
  4024.     MF3DVoidObjPtr    inObj)
  4025. {
  4026.     MF3DBoxObjPtr            writeObj;
  4027.     MF3DErr                    result;
  4028.  
  4029.     MF3D_VerifyObjectType(inObj, kMF3DObjBox);
  4030.     writeObj = (MF3DBoxObjPtr)inObj;
  4031.  
  4032.     result = kMF3DNoErr;
  4033.  
  4034.     if (writeObj->box != NULL)
  4035.     {    MF3D_WriteNewLine(inMetafilePtr);
  4036.         result = MF3D_Vector3DWrite(inMetafilePtr, writeObj->box->orientation);
  4037.  
  4038.         if (result == kMF3DNoErr)
  4039.         {    MF3D_WriteNewLine(inMetafilePtr);
  4040.             result = MF3D_Vector3DWrite(inMetafilePtr,
  4041.                     writeObj->box->majorAxis);
  4042.         }
  4043.  
  4044.         if (result == kMF3DNoErr)
  4045.         {    MF3D_WriteNewLine(inMetafilePtr);
  4046.             result = MF3D_Vector3DWrite(inMetafilePtr,
  4047.                     writeObj->box->minorAxis);
  4048.         }
  4049.  
  4050.         if (result == kMF3DNoErr)
  4051.         {    MF3D_WriteNewLine(inMetafilePtr);
  4052.             result = MF3D_Point3DWrite(inMetafilePtr, writeObj->box->origin);
  4053.         }
  4054.  
  4055.         if (result == kMF3DNoErr)
  4056.             MF3D_WriteNewLine(inMetafilePtr);
  4057.     }
  4058.  
  4059.     return result;
  4060. }
  4061.  
  4062. /*==============================================================================
  4063.  *    MF3D_ObjBoxDisposer
  4064.  *==============================================================================
  4065.  */
  4066. MF3DErr
  4067. MF3D_ObjBoxDisposer(
  4068.     MF3DVoidObjPtr    inObj)
  4069. {
  4070.     MF3D_VerifyObjectType(inObj, kMF3DObjBox);
  4071.  
  4072.     if (inObj != NULL)
  4073.     {    if (((MF3DBoxObjPtr)inObj)->box != NULL)
  4074.         MF3D_Free(((MF3DBoxObjPtr)inObj)->box);
  4075.         MF3D_Free(inObj);
  4076.     }
  4077.  
  4078.     return kMF3DNoErr;
  4079. }
  4080.  
  4081. /*==============================================================================
  4082.  *    MF3D_ObjConeReader
  4083.  *==============================================================================
  4084.  */
  4085. MF3DErr
  4086. MF3D_ObjConeReader(
  4087.     MF3D_FilePtr    inMetafilePtr,
  4088.     MF3DVoidObjPtr    *outObj)
  4089. {
  4090.     MF3DConeObjPtr                returnObj;
  4091.     MF3DVector3D                vector;
  4092.     MF3DErr                        numberExists;
  4093.     MF3DErr                        result;
  4094.  
  4095.     result = kMF3DNoErr;
  4096.  
  4097.     MF3D_Allocate(returnObj);
  4098.  
  4099.     if (result == kMF3DNoErr)
  4100.     {    returnObj->cone = NULL;
  4101.  
  4102.         numberExists = MF3D_Vector3DRead(inMetafilePtr, &vector);
  4103.     }
  4104.  
  4105.     if (result == kMF3DNoErr && numberExists == kMF3DNoErr)
  4106.     {    MF3D_Allocate(returnObj->cone);
  4107.  
  4108.         returnObj->cone->orientation.x = vector.x;
  4109.         returnObj->cone->orientation.y = vector.y;
  4110.         returnObj->cone->orientation.z = vector.z;
  4111.  
  4112.         if (result == kMF3DNoErr)
  4113.         {    result = MF3D_Vector3DRead(inMetafilePtr,
  4114.                     &returnObj->cone->majorAxis);
  4115.         }
  4116.  
  4117.         if (result == kMF3DNoErr)
  4118.         {    result = MF3D_Vector3DRead(inMetafilePtr,
  4119.                     &returnObj->cone->minorAxis);
  4120.         }
  4121.  
  4122.         if (result == kMF3DNoErr)
  4123.             result = MF3D_Point3DRead(inMetafilePtr, &returnObj->cone->origin);
  4124.     }
  4125.  
  4126.     if (result == kMF3DNoErr)
  4127.         *outObj = (MF3DVoidObjPtr) returnObj;
  4128.     else
  4129.         MF3D_Free(returnObj);
  4130.  
  4131.     return result;
  4132. }
  4133.  
  4134.  
  4135. /*==============================================================================
  4136.  *    MF3D_ObjConeWriter
  4137.  *==============================================================================
  4138.  */
  4139. MF3DErr
  4140. MF3D_ObjConeWriter(
  4141.     MF3D_FilePtr    inMetafilePtr,
  4142.     MF3DVoidObjPtr    inObj)
  4143. {
  4144.     MF3DConeObjPtr                writeObj;
  4145.     MF3DErr                        result;
  4146.  
  4147.     MF3D_VerifyObjectType(inObj, kMF3DObjCone);
  4148.     writeObj = (MF3DConeObjPtr)inObj;
  4149.  
  4150.     result = kMF3DNoErr;
  4151.  
  4152.     if (writeObj->cone != NULL)
  4153.     {    MF3D_WriteNewLine(inMetafilePtr);
  4154.         result = MF3D_Vector3DWrite(inMetafilePtr, writeObj->cone->orientation);
  4155.  
  4156.         if (result == kMF3DNoErr)
  4157.         {    MF3D_WriteNewLine(inMetafilePtr);
  4158.             result = MF3D_Vector3DWrite(inMetafilePtr,
  4159.                     writeObj->cone->majorAxis);
  4160.         }
  4161.  
  4162.         if (result == kMF3DNoErr)
  4163.         {    MF3D_WriteNewLine(inMetafilePtr);
  4164.             result = MF3D_Vector3DWrite(inMetafilePtr,
  4165.                 writeObj->cone->minorAxis);
  4166.         }
  4167.  
  4168.         if (result == kMF3DNoErr)
  4169.         {    MF3D_WriteNewLine(inMetafilePtr);
  4170.             result = MF3D_Point3DWrite(inMetafilePtr, writeObj->cone->origin);
  4171.         }
  4172.  
  4173.         if (result == kMF3DNoErr)
  4174.             MF3D_WriteNewLine(inMetafilePtr);
  4175.     }
  4176.  
  4177.     return result;
  4178. }
  4179.  
  4180. /*==============================================================================
  4181.  *    MF3D_ObjConeDisposer
  4182.  *==============================================================================
  4183.  */
  4184. MF3DErr
  4185. MF3D_ObjConeDisposer(
  4186.     MF3DVoidObjPtr    inObj)
  4187. {
  4188.     MF3D_VerifyObjectType(inObj, kMF3DObjCone);
  4189.  
  4190.     if (inObj != NULL)
  4191.     {    if (((MF3DConeObjPtr)inObj)->cone != NULL)
  4192.         MF3D_Free(((MF3DConeObjPtr)inObj)->cone);
  4193.         MF3D_Free(inObj);
  4194.     }
  4195.  
  4196.     return kMF3DNoErr;
  4197. }
  4198.  
  4199. /*==============================================================================
  4200.  *    MF3D_ObjCylinderReader
  4201.  *==============================================================================
  4202.  */
  4203. MF3DErr
  4204. MF3D_ObjCylinderReader(
  4205.     MF3D_FilePtr    inMetafilePtr,
  4206.     MF3DVoidObjPtr    *outObj)
  4207. {
  4208.     MF3DCylinderObjPtr            returnObj;
  4209.     MF3DVector3D                vector;
  4210.     MF3DErr                        numberExists;
  4211.     MF3DErr                        result;
  4212.  
  4213.     result = kMF3DNoErr;
  4214.  
  4215.     MF3D_Allocate(returnObj);
  4216.  
  4217.     if (result == kMF3DNoErr)
  4218.     {    returnObj->cylinder = NULL;
  4219.  
  4220.         numberExists = MF3D_Vector3DRead(inMetafilePtr, &vector);
  4221.     }
  4222.  
  4223.     if (result == kMF3DNoErr && numberExists == kMF3DNoErr)
  4224.     {    MF3D_Allocate(returnObj->cylinder);
  4225.  
  4226.         returnObj->cylinder->orientation.x = vector.x;
  4227.         returnObj->cylinder->orientation.y = vector.y;
  4228.         returnObj->cylinder->orientation.z = vector.z;
  4229.  
  4230.         if (result == kMF3DNoErr)
  4231.         {    result = MF3D_Vector3DRead(inMetafilePtr,
  4232.                     &returnObj->cylinder->majorAxis);
  4233.         }
  4234.  
  4235.         if (result == kMF3DNoErr)
  4236.         {    result = MF3D_Vector3DRead(inMetafilePtr,
  4237.                     &returnObj->cylinder->minorAxis);
  4238.         }
  4239.  
  4240.         if (result == kMF3DNoErr)
  4241.         {    result = MF3D_Point3DRead(inMetafilePtr,
  4242.                     &returnObj->cylinder->origin);
  4243.         }
  4244.     }
  4245.  
  4246.     if (result == kMF3DNoErr)
  4247.         *outObj = (MF3DVoidObjPtr) returnObj;
  4248.     else
  4249.         MF3D_Free(returnObj);
  4250.  
  4251.     return result;
  4252. }
  4253.  
  4254. #if defined(__COMPILING_ON_MACINTOSH__)
  4255. #pragma segment __OBJECTS_3__
  4256. #endif
  4257.  
  4258. /*==============================================================================
  4259.  *    MF3D_ObjCylinderWriter
  4260.  *==============================================================================
  4261.  */
  4262. MF3DErr
  4263. MF3D_ObjCylinderWriter(
  4264.     MF3D_FilePtr    inMetafilePtr,
  4265.     MF3DVoidObjPtr    inObj)
  4266. {
  4267.     MF3DCylinderObjPtr            writeObj;
  4268.     MF3DErr                        result;
  4269.  
  4270.     MF3D_VerifyObjectType(inObj, kMF3DObjCylinder);
  4271.     writeObj = (MF3DCylinderObjPtr)inObj;
  4272.  
  4273.     result = kMF3DNoErr;
  4274.  
  4275.     if (writeObj->cylinder != NULL)
  4276.     {    MF3D_WriteNewLine(inMetafilePtr);
  4277.         result = MF3D_Vector3DWrite(inMetafilePtr,
  4278.                 writeObj->cylinder->orientation);
  4279.  
  4280.         if (result == kMF3DNoErr)
  4281.         {    MF3D_WriteNewLine(inMetafilePtr);
  4282.             result = MF3D_Vector3DWrite(inMetafilePtr,
  4283.                     writeObj->cylinder->majorAxis);
  4284.         }
  4285.  
  4286.         if (result == kMF3DNoErr)
  4287.         {    MF3D_WriteNewLine(inMetafilePtr);
  4288.             result = MF3D_Vector3DWrite(inMetafilePtr,
  4289.                     writeObj->cylinder->minorAxis);
  4290.         }
  4291.  
  4292.         if (result == kMF3DNoErr)
  4293.         {    MF3D_WriteNewLine(inMetafilePtr);
  4294.             result = MF3D_Point3DWrite(inMetafilePtr,
  4295.                     writeObj->cylinder->origin);
  4296.         }
  4297.  
  4298.         if (result == kMF3DNoErr)
  4299.             MF3D_WriteNewLine(inMetafilePtr);
  4300.     }
  4301.  
  4302.     return result;
  4303. }
  4304.  
  4305. /*==============================================================================
  4306.  *    MF3D_ObjCylinderDisposer
  4307.  *==============================================================================
  4308.  */
  4309. MF3DErr
  4310. MF3D_ObjCylinderDisposer(
  4311.     MF3DVoidObjPtr    inObj)
  4312. {
  4313.     MF3D_VerifyObjectType(inObj, kMF3DObjCylinder);
  4314.  
  4315.     if (inObj != NULL)
  4316.     {    if (((MF3DCylinderObjPtr)inObj)->cylinder != NULL)
  4317.         MF3D_Free(((MF3DCylinderObjPtr)inObj)->cylinder);
  4318.         MF3D_Free(inObj);
  4319.     }
  4320.  
  4321.     return kMF3DNoErr;
  4322. }
  4323.  
  4324. /*==============================================================================
  4325.  *    MF3D_ObjDiskReader
  4326.  *==============================================================================
  4327.  */
  4328. MF3DErr
  4329. MF3D_ObjDiskReader(
  4330.     MF3D_FilePtr    inMetafilePtr,
  4331.     MF3DVoidObjPtr    *outObj)
  4332. {
  4333.     MF3DDiskObjPtr                returnObj;
  4334.     MF3DVector3D                vector;
  4335.     MF3DErr                        numberExists;
  4336.     MF3DErr                        result;
  4337.  
  4338.     result = kMF3DNoErr;
  4339.  
  4340.     MF3D_Allocate(returnObj);
  4341.  
  4342.     if (result == kMF3DNoErr)
  4343.     {    returnObj->disk = NULL;
  4344.  
  4345.         numberExists = MF3D_Vector3DRead(inMetafilePtr, &vector);
  4346.     }
  4347.  
  4348.     if (result == kMF3DNoErr && numberExists == kMF3DNoErr)
  4349.     {    MF3D_Allocate(returnObj->disk);
  4350.  
  4351.         returnObj->disk->majorRadius.x = vector.x;
  4352.         returnObj->disk->majorRadius.y = vector.y;
  4353.         returnObj->disk->majorRadius.z = vector.z;
  4354.  
  4355.         if (result == kMF3DNoErr)
  4356.         {    result = MF3D_Vector3DRead(inMetafilePtr,
  4357.                     &returnObj->disk->minorRadius);
  4358.         }
  4359.  
  4360.         if (result == kMF3DNoErr)
  4361.             result = MF3D_Point3DRead(inMetafilePtr, &returnObj->disk->origin);
  4362.     }
  4363.  
  4364.     if (result == kMF3DNoErr)
  4365.         *outObj = (MF3DVoidObjPtr) returnObj;
  4366.     else
  4367.         MF3D_Free(returnObj);
  4368.  
  4369.     return result;
  4370. }
  4371.  
  4372.  
  4373. /*==============================================================================
  4374.  *    MF3D_ObjDiskWriter
  4375.  *==============================================================================
  4376.  */
  4377. MF3DErr
  4378. MF3D_ObjDiskWriter(
  4379.     MF3D_FilePtr    inMetafilePtr,
  4380.     MF3DVoidObjPtr    inObj)
  4381. {
  4382.     MF3DDiskObjPtr                writeObj;
  4383.     MF3DErr                        result;
  4384.  
  4385.     MF3D_VerifyObjectType(inObj, kMF3DObjDisk);
  4386.     writeObj = (MF3DDiskObjPtr)inObj;
  4387.  
  4388.     result = kMF3DNoErr;
  4389.  
  4390.     if (writeObj->disk != NULL)
  4391.     {    MF3D_WriteNewLine(inMetafilePtr);
  4392.         result = MF3D_Vector3DWrite(inMetafilePtr,
  4393.                 writeObj->disk->majorRadius);
  4394.  
  4395.         if (result == kMF3DNoErr)
  4396.         {    MF3D_WriteNewLine(inMetafilePtr);
  4397.             result = MF3D_Vector3DWrite(inMetafilePtr,
  4398.                     writeObj->disk->minorRadius);
  4399.         }
  4400.  
  4401.         if (result == kMF3DNoErr)
  4402.         {    MF3D_WriteNewLine(inMetafilePtr);
  4403.             result = MF3D_Point3DWrite(inMetafilePtr,
  4404.                     writeObj->disk->origin);
  4405.         }
  4406.  
  4407.         if (result == kMF3DNoErr)
  4408.             MF3D_WriteNewLine(inMetafilePtr);
  4409.     }
  4410.  
  4411.     return result;
  4412. }
  4413.  
  4414. /*==============================================================================
  4415.  *    MF3D_ObjDiskDisposer
  4416.  *==============================================================================
  4417.  */
  4418. MF3DErr
  4419. MF3D_ObjDiskDisposer(
  4420.     MF3DVoidObjPtr    inObj)
  4421. {
  4422.     MF3D_VerifyObjectType(inObj, kMF3DObjDisk);
  4423.  
  4424.     if (inObj != NULL)
  4425.     {    MF3D_Free(((MF3DDiskObjPtr)inObj)->disk);
  4426.         MF3D_Free(inObj);
  4427.     }
  4428.  
  4429.     return kMF3DNoErr;
  4430. }
  4431.  
  4432. /*==============================================================================
  4433.  *    MF3D_ObjEllipseReader
  4434.  *==============================================================================
  4435.  */
  4436. MF3DErr
  4437. MF3D_ObjEllipseReader(
  4438.     MF3D_FilePtr    inMetafilePtr,
  4439.     MF3DVoidObjPtr    *outObj)
  4440. {
  4441.     MF3DEllipseObjPtr            returnObj;
  4442.     MF3DVector3D                vector;
  4443.     MF3DErr                        numberExists;
  4444.     MF3DErr                        result;
  4445.  
  4446.     result = kMF3DNoErr;
  4447.  
  4448.     MF3D_Allocate(returnObj);
  4449.  
  4450.     if (result == kMF3DNoErr)
  4451.     {    returnObj->ellipse = NULL;
  4452.  
  4453.         numberExists = MF3D_Vector3DRead(inMetafilePtr, &vector);
  4454.     }
  4455.  
  4456.     if (result == kMF3DNoErr && numberExists == kMF3DNoErr)
  4457.     {    MF3D_Allocate(returnObj->ellipse);
  4458.  
  4459.         returnObj->ellipse->majorAxis.x = vector.x;
  4460.         returnObj->ellipse->majorAxis.y = vector.y;
  4461.         returnObj->ellipse->majorAxis.z = vector.z;
  4462.  
  4463.         if (result == kMF3DNoErr)
  4464.         {    result = MF3D_Vector3DRead(inMetafilePtr,
  4465.                     &returnObj->ellipse->minorAxis);
  4466.         }
  4467.  
  4468.         if (result == kMF3DNoErr)
  4469.             result = MF3D_Point3DRead(inMetafilePtr, &returnObj->ellipse->origin);
  4470.     }
  4471.  
  4472.     if (result == kMF3DNoErr)
  4473.         *outObj = (MF3DVoidObjPtr) returnObj;
  4474.     else
  4475.         MF3D_Free(returnObj);
  4476.  
  4477.     return result;
  4478. }
  4479.  
  4480.  
  4481. /*==============================================================================
  4482.  *    MF3D_ObjEllipseWriter
  4483.  *==============================================================================
  4484.  */
  4485. MF3DErr
  4486. MF3D_ObjEllipseWriter(
  4487.     MF3D_FilePtr    inMetafilePtr,
  4488.     MF3DVoidObjPtr    inObj)
  4489. {
  4490.     MF3DEllipseObjPtr            writeObj;
  4491.     MF3DErr                        result;
  4492.  
  4493.     MF3D_VerifyObjectType(inObj, kMF3DObjEllipse);
  4494.     writeObj = (MF3DEllipseObjPtr)inObj;
  4495.  
  4496.     result = kMF3DNoErr;
  4497.  
  4498.     if (writeObj->ellipse != NULL)
  4499.     {    MF3D_WriteNewLine(inMetafilePtr);
  4500.         result = MF3D_Vector3DWrite(inMetafilePtr,
  4501.                 writeObj->ellipse->majorAxis);
  4502.  
  4503.         if (result == kMF3DNoErr)
  4504.         {    MF3D_WriteNewLine(inMetafilePtr);
  4505.             result = MF3D_Vector3DWrite(inMetafilePtr,
  4506.                     writeObj->ellipse->minorAxis);
  4507.         }
  4508.  
  4509.         if (result == kMF3DNoErr)
  4510.         {    MF3D_WriteNewLine(inMetafilePtr);
  4511.             result = MF3D_Point3DWrite(inMetafilePtr,
  4512.                     writeObj->ellipse->origin);
  4513.         }
  4514.  
  4515.         if (result == kMF3DNoErr)
  4516.             MF3D_WriteNewLine(inMetafilePtr);
  4517.     }
  4518.  
  4519.     return result;
  4520. }
  4521.  
  4522. /*==============================================================================
  4523.  *    MF3D_ObjEllipseDisposer
  4524.  *==============================================================================
  4525.  */
  4526. MF3DErr
  4527. MF3D_ObjEllipseDisposer(
  4528.     MF3DVoidObjPtr    inObj)
  4529. {
  4530.     MF3D_VerifyObjectType(inObj, kMF3DObjEllipse);
  4531.  
  4532.     if (inObj != NULL)
  4533.     {    MF3D_Free(((MF3DEllipseObjPtr)inObj)->ellipse);
  4534.         MF3D_Free(inObj);
  4535.     }
  4536.  
  4537.     return kMF3DNoErr;
  4538. }
  4539.  
  4540. /*==============================================================================
  4541.  *    MF3D_ObjEllipsoidReader
  4542.  *==============================================================================
  4543.  */
  4544. MF3DErr
  4545. MF3D_ObjEllipsoidReader(
  4546.     MF3D_FilePtr    inMetafilePtr,
  4547.     MF3DVoidObjPtr    *outObj)
  4548. {
  4549.     MF3DEllipsoidObjPtr            returnObj;
  4550.     MF3DVector3D                vector;
  4551.     MF3DErr                        numberExists;
  4552.     MF3DErr                        result;
  4553.  
  4554.     result = kMF3DNoErr;
  4555.  
  4556.     MF3D_Allocate(returnObj);
  4557.  
  4558.     if (result == kMF3DNoErr)
  4559.     {    returnObj->ellipsoid = NULL;
  4560.  
  4561.         numberExists = MF3D_Vector3DRead(inMetafilePtr, &vector);
  4562.     }
  4563.  
  4564.     if (result == kMF3DNoErr && numberExists == kMF3DNoErr)
  4565.     {    MF3D_Allocate(returnObj->ellipsoid);
  4566.  
  4567.         returnObj->ellipsoid->orientation.x = vector.x;
  4568.         returnObj->ellipsoid->orientation.y = vector.y;
  4569.         returnObj->ellipsoid->orientation.z = vector.z;
  4570.  
  4571.         if (result == kMF3DNoErr)
  4572.         {    result = MF3D_Vector3DRead(inMetafilePtr,
  4573.                     &returnObj->ellipsoid->majorRadius);
  4574.         }
  4575.  
  4576.         if (result == kMF3DNoErr)
  4577.         {    result = MF3D_Vector3DRead(inMetafilePtr,
  4578.                     &returnObj->ellipsoid->minorRadius);
  4579.         }
  4580.  
  4581.         if (result == kMF3DNoErr)
  4582.         {    result = MF3D_Point3DRead(inMetafilePtr,
  4583.                     &returnObj->ellipsoid->origin);
  4584.         }
  4585.     }
  4586.  
  4587.     if (result == kMF3DNoErr)
  4588.         *outObj = (MF3DVoidObjPtr) returnObj;
  4589.     else
  4590.         MF3D_Free(returnObj);
  4591.  
  4592.     return result;
  4593. }
  4594.  
  4595.  
  4596. /*==============================================================================
  4597.  *    MF3D_ObjEllipsoidWriter
  4598.  *==============================================================================
  4599.  */
  4600. MF3DErr
  4601. MF3D_ObjEllipsoidWriter(
  4602.     MF3D_FilePtr    inMetafilePtr,
  4603.     MF3DVoidObjPtr    inObj)
  4604. {
  4605.     MF3DEllipsoidObjPtr            writeObj;
  4606.     MF3DErr                        result;
  4607.  
  4608.     MF3D_VerifyObjectType(inObj, kMF3DObjEllipsoid);
  4609.     writeObj = (MF3DEllipsoidObjPtr)inObj;
  4610.  
  4611.     result = kMF3DNoErr;
  4612.  
  4613.     if (writeObj->ellipsoid != NULL)
  4614.     {    MF3D_WriteNewLine(inMetafilePtr);
  4615.         result = MF3D_Vector3DWrite(inMetafilePtr,
  4616.                 writeObj->ellipsoid->orientation);
  4617.  
  4618.         if (result == kMF3DNoErr)
  4619.         {    MF3D_WriteNewLine(inMetafilePtr);
  4620.             result = MF3D_Vector3DWrite(inMetafilePtr,
  4621.                     writeObj->ellipsoid->majorRadius);
  4622.         }
  4623.  
  4624.         if (result == kMF3DNoErr)
  4625.         {    MF3D_WriteNewLine(inMetafilePtr);
  4626.             result = MF3D_Vector3DWrite(inMetafilePtr,
  4627.                     writeObj->ellipsoid->minorRadius);
  4628.         }
  4629.  
  4630.         if (result == kMF3DNoErr)
  4631.         {    MF3D_WriteNewLine(inMetafilePtr);
  4632.             result = MF3D_Point3DWrite(inMetafilePtr,
  4633.                     writeObj->ellipsoid->origin);
  4634.         }
  4635.  
  4636.         if (result == kMF3DNoErr)
  4637.             MF3D_WriteNewLine(inMetafilePtr);
  4638.     }
  4639.  
  4640.     return result;
  4641. }
  4642.  
  4643. /*==============================================================================
  4644.  *    MF3D_ObjEllipsoidDisposer
  4645.  *==============================================================================
  4646.  */
  4647. MF3DErr
  4648. MF3D_ObjEllipsoidDisposer(
  4649.     MF3DVoidObjPtr    inObj)
  4650. {
  4651.     MF3D_VerifyObjectType(inObj, kMF3DObjEllipsoid);
  4652.  
  4653.     if (inObj != NULL)
  4654.     {    MF3D_Free(((MF3DEllipsoidObjPtr)inObj)->ellipsoid);
  4655.         MF3D_Free(inObj);
  4656.     }
  4657.  
  4658.     return kMF3DNoErr;
  4659. }
  4660.  
  4661. /*==============================================================================
  4662.  *    MF3D_ObjGeneralPolygonHintReader
  4663.  *==============================================================================
  4664.  */
  4665. MF3DErr
  4666. MF3D_ObjGeneralPolygonHintReader(
  4667.     MF3D_FilePtr    inMetafilePtr,
  4668.     MF3DVoidObjPtr    *outObj)
  4669. {
  4670.     MF3DGeneralPolygonHintObjPtr    returnObj;
  4671.     MF3DErr                            result;
  4672.  
  4673.     result = kMF3DNoErr;
  4674.  
  4675.     MF3D_Allocate(returnObj);
  4676.  
  4677.     if (result == kMF3DNoErr)
  4678.     {    result = MF3D_EnumRead(inMetafilePtr, gMF3D_GeneralPolygonHintEnum,
  4679.                 &returnObj->shapeHint);
  4680.     }
  4681.  
  4682.     if (result == kMF3DNoErr)
  4683.         *outObj = (MF3DVoidObjPtr) returnObj;
  4684.     else
  4685.         MF3D_Free(returnObj);
  4686.  
  4687.     return result;
  4688. }
  4689.  
  4690. /*==============================================================================
  4691.  *    MF3D_ObjGeneralPolygonHintWriter
  4692.  *==============================================================================
  4693.  */
  4694. MF3DErr
  4695. MF3D_ObjGeneralPolygonHintWriter(
  4696.     MF3D_FilePtr    inMetafilePtr,
  4697.     MF3DVoidObjPtr    inObj)
  4698. {
  4699.     MF3D_VerifyObjectType(inObj, kMF3DObjGeneralPolygonHint);
  4700.     return MF3D_FlagsWrite(inMetafilePtr, gMF3D_GeneralPolygonHintEnum,
  4701.                 ((MF3DGeneralPolygonHintObjPtr)inObj)->shapeHint);
  4702. }
  4703.  
  4704. /*==============================================================================
  4705.  *    MF3D_ObjGeneralPolygonHintDisposer
  4706.  *==============================================================================
  4707.  */
  4708. MF3DErr
  4709. MF3D_ObjGeneralPolygonHintDisposer(
  4710.     MF3DVoidObjPtr    inObj)
  4711. {
  4712.     MF3D_VerifyObjectType(inObj, kMF3DObjGeneralPolygonHint);
  4713.  
  4714.     MF3D_Free(inObj);
  4715.     return kMF3DNoErr;
  4716. }
  4717.  
  4718. /*==============================================================================
  4719.  *    MF3D_ObjGeneralPolygonReader
  4720.  *==============================================================================
  4721.  */
  4722. MF3DErr
  4723. MF3D_ObjGeneralPolygonReader(
  4724.     MF3D_FilePtr    inMetafilePtr,
  4725.     MF3DVoidObjPtr    *outObj)
  4726. {
  4727.     MF3DGeneralPolygonObjPtr    returnObj;
  4728.     MF3DUns32                    numContours;
  4729.     MF3DErr                        result;
  4730.  
  4731.     result = kMF3DNoErr;
  4732.  
  4733.     MF3D_Allocate(returnObj);
  4734.  
  4735.     if (result == kMF3DNoErr)
  4736.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->nContours);
  4737.  
  4738.     if (result == kMF3DNoErr)
  4739.     {    numContours = returnObj->nContours;
  4740.         if (numContours <= 0)
  4741.             result = kMF3DErrNumContoursIsZero;
  4742.     }
  4743.  
  4744.     /* Read polygon data */
  4745.  
  4746.     if (result == kMF3DNoErr)
  4747.     {    MF3DPolygonDataPtr        curContourPtr;
  4748.  
  4749.         returnObj->polygons = MF3D_Malloc(numContours *
  4750.                 sizeof(*returnObj->polygons));
  4751.         if (returnObj->polygons == NULL)
  4752.             result = kMF3DErrOutOfMemory;
  4753.  
  4754.         curContourPtr = returnObj->polygons;
  4755.         while (result == kMF3DNoErr && numContours > 0)
  4756.         {    MF3DUns32    numVertices;
  4757.  
  4758.             result = MF3D_Uns32Read(inMetafilePtr, &curContourPtr->nVertices);
  4759.  
  4760.             if (result == kMF3DNoErr)
  4761.             {    numVertices = curContourPtr->nVertices;
  4762.                 if (numVertices <= 2)
  4763.                     result = kMF3DErrTooFewVertices;
  4764.             }
  4765.  
  4766.             if (result == kMF3DNoErr)
  4767.             {    MF3DPoint3DPtr    curVertexPtr;
  4768.  
  4769.                 curContourPtr->vertices = MF3D_Malloc(numVertices *
  4770.                         sizeof(*curContourPtr->vertices));
  4771.                 if (curContourPtr->vertices == NULL)
  4772.                     result = kMF3DErrOutOfMemory;
  4773.  
  4774.                 curVertexPtr = curContourPtr->vertices;
  4775.                 while (result == kMF3DNoErr && numVertices > 0)
  4776.                 {    result = MF3D_Point3DRead(inMetafilePtr, curVertexPtr);
  4777.                     --numVertices;
  4778.                     ++curVertexPtr;
  4779.                 }
  4780.  
  4781.                 if (result != kMF3DNoErr)
  4782.                     MF3D_Free(curContourPtr->vertices);
  4783.             }
  4784.  
  4785.             --numContours;
  4786.             ++curContourPtr;
  4787.         }
  4788.  
  4789.         if (result != kMF3DNoErr)
  4790.         {    MF3D_Free(returnObj->polygons);
  4791.         }
  4792.     }
  4793.  
  4794.     if (result == kMF3DNoErr)
  4795.         *outObj = (MF3DVoidObjPtr) returnObj;
  4796.     else
  4797.         MF3D_Free(returnObj);
  4798.  
  4799.     return result;
  4800. }
  4801.  
  4802.  
  4803. /*==============================================================================
  4804.  *    MF3D_ObjGeneralPolygonWriter
  4805.  *==============================================================================
  4806.  */
  4807. MF3DErr
  4808. MF3D_ObjGeneralPolygonWriter(
  4809.     MF3D_FilePtr    inMetafilePtr,
  4810.     MF3DVoidObjPtr    inObj)
  4811. {
  4812.     MF3DGeneralPolygonObjPtr    writeObj;
  4813.     MF3DUns32                    numContours;
  4814.     MF3DErr                        result;
  4815.  
  4816.     MF3D_VerifyObjectType(inObj, kMF3DObjGeneralPolygon);
  4817.     writeObj = (MF3DGeneralPolygonObjPtr)inObj;
  4818.  
  4819.     result = kMF3DNoErr;
  4820.  
  4821.     numContours = writeObj->nContours;
  4822.     if (numContours <= 0)
  4823.         result = kMF3DErrNumContoursIsZero;
  4824.  
  4825.     if (result == kMF3DNoErr)
  4826.     {    MF3D_WriteNewLine(inMetafilePtr);
  4827.         result = MF3D_Uns32Write(inMetafilePtr, numContours);
  4828.     }
  4829.  
  4830.     /* Write polygon data */
  4831.  
  4832.     if (result == kMF3DNoErr)
  4833.     {    MF3DPolygonDataPtr        curContourPtr;
  4834.         MF3DUns32                contourNum;
  4835.  
  4836.         MF3D_CommentStrWrite(inMetafilePtr, "nContours");
  4837.  
  4838.         curContourPtr = writeObj->polygons;
  4839.         for (contourNum = 0;
  4840.                 result == kMF3DNoErr && contourNum < numContours;
  4841.                 ++contourNum)
  4842.         {    MF3DUns32    numVertices;
  4843.  
  4844.             numVertices = curContourPtr->nVertices;
  4845.             if (numVertices <= 2)
  4846.                 result = kMF3DErrTooFewVertices;
  4847.  
  4848.             if (result == kMF3DNoErr)
  4849.             {    result = MF3D_Uns32Write(inMetafilePtr,
  4850.                         curContourPtr->nVertices);
  4851.             }
  4852.  
  4853.             if (result == kMF3DNoErr)
  4854.                 MF3D_CommentNumWrite(inMetafilePtr, contourNum);
  4855.  
  4856.             if (result == kMF3DNoErr)
  4857.             {    MF3DPoint3DPtr    curVertexPtr;
  4858.                 MF3DUns32        vertexNum;
  4859.  
  4860.                 curVertexPtr = curContourPtr->vertices;
  4861.                 for (vertexNum = 0;
  4862.                         result == kMF3DNoErr && vertexNum < numVertices;
  4863.                         ++vertexNum)
  4864.                 {    result = MF3D_Point3DWrite(inMetafilePtr, *curVertexPtr++);
  4865.                     if (result == kMF3DNoErr)
  4866.                         MF3D_WriteNewLine(inMetafilePtr);
  4867.                 }
  4868.             }
  4869.             ++curContourPtr;
  4870.         }
  4871.     }
  4872.  
  4873.     return result;
  4874. }
  4875.  
  4876. /*==============================================================================
  4877.  *    MF3D_ObjGeneralPolygonDisposer
  4878.  *==============================================================================
  4879.  */
  4880. MF3DErr
  4881. MF3D_ObjGeneralPolygonDisposer(
  4882.     MF3DVoidObjPtr    inObj)
  4883. {
  4884.     MF3DGeneralPolygonObjPtr    polygonObj;
  4885.  
  4886.     MF3D_VerifyObjectType(inObj, kMF3DObjGeneralPolygon);
  4887.  
  4888.     polygonObj = (MF3DGeneralPolygonObjPtr) inObj;
  4889.  
  4890.     if (polygonObj != NULL)
  4891.     {    if (polygonObj->polygons != NULL)
  4892.         {    MF3DUns32            numContours;
  4893.             MF3DPolygonDataPtr    contourPtr;
  4894.  
  4895.             contourPtr = polygonObj->polygons;
  4896.             for (numContours = polygonObj->nContours; numContours > 0;
  4897.                     --numContours)
  4898.             {    MF3D_Free(contourPtr->vertices);
  4899.                 ++contourPtr;
  4900.             }
  4901.             MF3D_Free(polygonObj->polygons);
  4902.         }
  4903.  
  4904.         MF3D_Free(polygonObj);
  4905.     }
  4906.     return kMF3DNoErr;
  4907. }
  4908.  
  4909. /*==============================================================================
  4910.  *    MF3D_ObjLineReader
  4911.  *==============================================================================
  4912.  */
  4913. MF3DErr
  4914. MF3D_ObjLineReader(
  4915.     MF3D_FilePtr    inMetafilePtr,
  4916.     MF3DVoidObjPtr    *outObj)
  4917. {
  4918.     MF3DLineObjPtr                returnObj;
  4919.     MF3DErr                        result;
  4920.  
  4921.     result = kMF3DNoErr;
  4922.  
  4923.     MF3D_Allocate(returnObj);
  4924.  
  4925.     if (result == kMF3DNoErr)
  4926.         result = MF3D_Point3DRead(inMetafilePtr, &returnObj->start);
  4927.  
  4928.     if (result == kMF3DNoErr)
  4929.         result = MF3D_Point3DRead(inMetafilePtr, &returnObj->end);
  4930.  
  4931.     if (result == kMF3DNoErr)
  4932.         *outObj = (MF3DVoidObjPtr) returnObj;
  4933.     else
  4934.         MF3D_Free(returnObj);
  4935.  
  4936.     return result;
  4937. }
  4938.  
  4939.  
  4940. /*==============================================================================
  4941.  *    MF3D_ObjLineWriter
  4942.  *==============================================================================
  4943.  */
  4944. MF3DErr
  4945. MF3D_ObjLineWriter(
  4946.     MF3D_FilePtr    inMetafilePtr,
  4947.     MF3DVoidObjPtr    inObj)
  4948. {
  4949.     MF3DLineObjPtr                writeObj;
  4950.     MF3DErr                        result;
  4951.  
  4952.     MF3D_VerifyObjectType(inObj, kMF3DObjLine);
  4953.     writeObj = (MF3DLineObjPtr)inObj;
  4954.  
  4955.     MF3D_WriteNewLine(inMetafilePtr);
  4956.     result = MF3D_Point3DWrite(inMetafilePtr, writeObj->start);
  4957.  
  4958.     if (result == kMF3DNoErr)
  4959.     {    MF3D_WriteNewLine(inMetafilePtr);
  4960.         result = MF3D_Point3DWrite(inMetafilePtr, writeObj->end);
  4961.     }
  4962.  
  4963.     if (result == kMF3DNoErr)
  4964.         MF3D_WriteNewLine(inMetafilePtr);
  4965.  
  4966.     return result;
  4967. }
  4968.  
  4969. /*==============================================================================
  4970.  *    MF3D_ObjLineDisposer
  4971.  *==============================================================================
  4972.  */
  4973. MF3DErr
  4974. MF3D_ObjLineDisposer(
  4975.     MF3DVoidObjPtr    inObj)
  4976. {
  4977.     MF3D_VerifyObjectType(inObj, kMF3DObjLine);
  4978.  
  4979.     MF3D_Free(inObj);
  4980.     return kMF3DNoErr;
  4981. }
  4982.  
  4983. /*==============================================================================
  4984.  *    MF3D_ObjMarkerReader
  4985.  *==============================================================================
  4986.  */
  4987. MF3DErr
  4988. MF3D_ObjMarkerReader(
  4989.     MF3D_FilePtr    inMetafilePtr,
  4990.     MF3DVoidObjPtr    *outObj)
  4991. {
  4992.     MF3DMarkerObjPtr            returnObj;
  4993.     MF3DUns32                    imageSize;
  4994.     MF3DErr                        result;
  4995.  
  4996.     result = kMF3DNoErr;
  4997.  
  4998.     MF3D_Allocate(returnObj);
  4999.  
  5000.     if (result == kMF3DNoErr)
  5001.         result = MF3D_Point3DRead(inMetafilePtr, &returnObj->location);
  5002.  
  5003.     if (result == kMF3DNoErr)
  5004.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->width);
  5005.  
  5006.     if (result == kMF3DNoErr)
  5007.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->height);
  5008.  
  5009.     if (result == kMF3DNoErr)
  5010.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->rowBytes);
  5011.  
  5012.     if (result == kMF3DNoErr)
  5013.         result = MF3D_Int32Read(inMetafilePtr, &returnObj->xOffset);
  5014.  
  5015.     if (result == kMF3DNoErr)
  5016.         result = MF3D_Int32Read(inMetafilePtr, &returnObj->yOffset);
  5017.  
  5018.     if (result == kMF3DNoErr)
  5019.     {    imageSize = returnObj->height * returnObj->rowBytes;
  5020.         if (imageSize == 0)
  5021.             result = kMF3DErrWidthOrHeightIsZero;
  5022.     }
  5023.  
  5024.     if (result == kMF3DNoErr)
  5025.     {    returnObj->data = MF3D_Malloc(imageSize);
  5026.         if (returnObj->data == NULL)
  5027.             result = kMF3DErrOutOfMemory;
  5028.     }
  5029.  
  5030.     if (result == kMF3DNoErr)
  5031.     {    result = MF3D_RawDataRead(inMetafilePtr, imageSize, returnObj->data);
  5032.         if (result != kMF3DNoErr)
  5033.             MF3D_Free(returnObj->data);
  5034.     }
  5035.  
  5036.     if (result == kMF3DNoErr)
  5037.         *outObj = (MF3DVoidObjPtr) returnObj;
  5038.     else
  5039.         MF3D_Free(returnObj);
  5040.  
  5041.     return result;
  5042. }
  5043.  
  5044.  
  5045. /*==============================================================================
  5046.  *    MF3D_ObjMarkerWriter
  5047.  *==============================================================================
  5048.  */
  5049. MF3DErr
  5050. MF3D_ObjMarkerWriter(
  5051.     MF3D_FilePtr    inMetafilePtr,
  5052.     MF3DVoidObjPtr    inObj)
  5053. {
  5054.     MF3DMarkerObjPtr            writeObj;
  5055.     MF3DUns32                    imageSize;
  5056.     MF3DErr                        result;
  5057.  
  5058.     MF3D_VerifyObjectType(inObj, kMF3DObjMarker);
  5059.     writeObj = (MF3DMarkerObjPtr)inObj;
  5060.  
  5061.     result = kMF3DNoErr;
  5062.  
  5063.     imageSize = writeObj->height * writeObj->rowBytes;
  5064.     if (imageSize == 0)
  5065.         result = kMF3DErrWidthOrHeightIsZero;
  5066.  
  5067.     if (result == kMF3DNoErr)
  5068.         result = MF3D_Point3DWrite(inMetafilePtr, writeObj->location);
  5069.  
  5070.     if (result == kMF3DNoErr)
  5071.         result = MF3D_Uns32Write(inMetafilePtr, writeObj->width);
  5072.  
  5073.     if (result == kMF3DNoErr)
  5074.         result = MF3D_Uns32Write(inMetafilePtr, writeObj->height);
  5075.  
  5076.     if (result == kMF3DNoErr)
  5077.         result = MF3D_Uns32Write(inMetafilePtr, writeObj->rowBytes);
  5078.  
  5079.     if (result == kMF3DNoErr)
  5080.         result = MF3D_Int32Write(inMetafilePtr, writeObj->xOffset);
  5081.  
  5082.     if (result == kMF3DNoErr)
  5083.         result = MF3D_Int32Write(inMetafilePtr, writeObj->yOffset);
  5084.  
  5085.     if (result == kMF3DNoErr)
  5086.         result = MF3D_RawDataWrite(inMetafilePtr, imageSize, writeObj->data);
  5087.  
  5088.     return result;
  5089. }
  5090.  
  5091. /*==============================================================================
  5092.  *    MF3D_ObjMarkerDisposer
  5093.  *==============================================================================
  5094.  */
  5095. MF3DErr
  5096. MF3D_ObjMarkerDisposer(
  5097.     MF3DVoidObjPtr    inObj)
  5098. {
  5099.     MF3D_VerifyObjectType(inObj, kMF3DObjMarker);
  5100.  
  5101.     if (inObj != NULL)
  5102.     {    MF3D_Free(((MF3DMarkerObjPtr)inObj)->data);
  5103.         MF3D_Free(inObj);
  5104.     }
  5105.     return kMF3DNoErr;
  5106. }
  5107.  
  5108. /*==============================================================================
  5109.  *    MF3D_ObjMeshReader
  5110.  *==============================================================================
  5111.  */
  5112. MF3DErr
  5113. MF3D_ObjMeshReader(
  5114.     MF3D_FilePtr    inMetafilePtr,
  5115.     MF3DVoidObjPtr    *outObj)
  5116. {
  5117.     MF3DMeshObjPtr                returnObj;
  5118.     MF3DUns32                    numVertices;
  5119.     MF3DErr                        result;
  5120.  
  5121.     result = kMF3DNoErr;
  5122.  
  5123.     MF3D_Allocate(returnObj);
  5124.  
  5125.     if (result == kMF3DNoErr)
  5126.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->nVertices);
  5127.  
  5128.     if (result == kMF3DNoErr)
  5129.     {    numVertices = returnObj->nVertices;
  5130.         if (numVertices <= 2)
  5131.             result = kMF3DErrTooFewVertices;
  5132.     }
  5133.  
  5134.     if (result == kMF3DNoErr)
  5135.     {    MF3DPoint3DPtr    curVertexPtr;
  5136.  
  5137.         returnObj->vertices = MF3D_Malloc(numVertices *
  5138.                 sizeof(*returnObj->vertices));
  5139.         if (returnObj->vertices == NULL)
  5140.             result = kMF3DErrOutOfMemory;
  5141.  
  5142.         curVertexPtr = returnObj->vertices;
  5143.         while (result == kMF3DNoErr && numVertices > 0)
  5144.         {    result = MF3D_Point3DRead(inMetafilePtr, curVertexPtr);
  5145.             --numVertices;
  5146.             ++curVertexPtr;
  5147.         }
  5148.  
  5149.         if (result != kMF3DNoErr)
  5150.             MF3D_Free(returnObj->vertices);
  5151.     }
  5152.  
  5153.     if (result == kMF3DNoErr)
  5154.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->nFaces);
  5155.  
  5156.     if (result == kMF3DNoErr)
  5157.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->nContours);
  5158.  
  5159.     if (result == kMF3DNoErr)
  5160.     {    MF3DUns32    numMeshFaces;
  5161.  
  5162.         numMeshFaces = returnObj->nFaces + returnObj->nContours;
  5163.  
  5164.         if (numMeshFaces == 0)
  5165.         {    returnObj->faces = NULL;
  5166.         }
  5167.         else
  5168.         {    MF3DMeshFacePtr    curMeshFacePtr;
  5169.         
  5170.             returnObj->faces = MF3D_Malloc(numMeshFaces *
  5171.                     sizeof(*returnObj->faces));
  5172.             if (returnObj->faces == NULL)
  5173.                 result = kMF3DErrOutOfMemory;
  5174.     
  5175.             curMeshFacePtr = returnObj->faces;
  5176.             while (result == kMF3DNoErr && numMeshFaces > 0)
  5177.             {    MF3DUns32    numFaceVertexIndices;
  5178.  
  5179.                 result = MF3D_Uns32Read(inMetafilePtr,
  5180.                         &curMeshFacePtr->nFaceVertexIndices);
  5181.  
  5182.                 if (result == kMF3DNoErr)
  5183.                 {    numFaceVertexIndices = curMeshFacePtr->nFaceVertexIndices;
  5184.                     if (numFaceVertexIndices <= 2)
  5185.                         result = kMF3DErrTooFewVertices;
  5186.                 }
  5187.  
  5188.                 if (result == kMF3DNoErr)
  5189.                 {    MF3DUns32Ptr    curVertexPtr;
  5190.  
  5191.                     curMeshFacePtr->faceVertexIndices =
  5192.                             MF3D_Malloc(numFaceVertexIndices *
  5193.                             sizeof(*curMeshFacePtr->faceVertexIndices));
  5194.                     if (curMeshFacePtr->faceVertexIndices == NULL)
  5195.                         result = kMF3DErrOutOfMemory;
  5196.  
  5197.                     curVertexPtr = curMeshFacePtr->faceVertexIndices;
  5198.                     while (result == kMF3DNoErr && numFaceVertexIndices > 0)
  5199.                     {    result = MF3D_Uns32Read(inMetafilePtr, curVertexPtr);
  5200.                         --numFaceVertexIndices;
  5201.                         ++curVertexPtr;
  5202.                     }
  5203.  
  5204.                     if (result != kMF3DNoErr)
  5205.                         MF3D_Free(curMeshFacePtr->faceVertexIndices);
  5206.                 }
  5207.  
  5208.                 --numMeshFaces;
  5209.                 ++curMeshFacePtr;
  5210.             }
  5211.  
  5212.             if (result != kMF3DNoErr)
  5213.                 MF3D_Free(returnObj->faces);
  5214.         }
  5215.     }
  5216.  
  5217.     if (result == kMF3DNoErr)
  5218.         *outObj = (MF3DVoidObjPtr) returnObj;
  5219.     else
  5220.         MF3D_Free(returnObj);
  5221.  
  5222.     return result;
  5223. }
  5224.  
  5225. /*==============================================================================
  5226.  *    MF3D_ObjMeshWriter
  5227.  *==============================================================================
  5228.  */
  5229. MF3DErr
  5230. MF3D_ObjMeshWriter(
  5231.     MF3D_FilePtr    inMetafilePtr,
  5232.     MF3DVoidObjPtr    inObj)
  5233. {
  5234.     MF3DMeshObjPtr    meshObj;
  5235.     MF3DUns32        nVertices;
  5236.     MF3DErr            result;
  5237.  
  5238.     MF3D_VerifyObjectType(inObj, kMF3DObjMesh);
  5239.     meshObj = (MF3DMeshObjPtr)inObj;
  5240.  
  5241.     result = kMF3DNoErr;
  5242.  
  5243.     MF3D_WriteNewLine(inMetafilePtr);
  5244.  
  5245.     if (result == kMF3DNoErr)
  5246.     {    nVertices = meshObj->nVertices;
  5247.         if (nVertices <= 2)
  5248.             result = kMF3DErrTooFewVertices;
  5249.     }
  5250.  
  5251.     result = MF3D_Uns32Write(inMetafilePtr, nVertices);
  5252.  
  5253.     if (result == kMF3DNoErr)
  5254.     {    MF3DUns32        vertexNum;
  5255.         MF3DPoint3DPtr    curVertexPtr;
  5256.  
  5257.         MF3D_CommentStrWrite(inMetafilePtr, "nVertices");
  5258.  
  5259.         curVertexPtr = meshObj->vertices;
  5260.         for (vertexNum = 0;
  5261.                 result == kMF3DNoErr && vertexNum < nVertices;
  5262.                 ++vertexNum)
  5263.         {    result = MF3D_Point3DWrite(inMetafilePtr, *curVertexPtr++);
  5264.             if (result == kMF3DNoErr)
  5265.                 MF3D_CommentNumWrite(inMetafilePtr, vertexNum);
  5266.         }
  5267.     }
  5268.  
  5269.     if (result == kMF3DNoErr)
  5270.         result = MF3D_Uns32Write(inMetafilePtr, meshObj->nFaces);
  5271.  
  5272.     if (result == kMF3DNoErr)
  5273.     {    MF3D_CommentStrWrite(inMetafilePtr, "nFaces");
  5274.         result = MF3D_Uns32Write(inMetafilePtr, meshObj->nContours);
  5275.     }
  5276.  
  5277.     if (result == kMF3DNoErr)
  5278.     {    MF3DUns32        faceNum, nMeshFaces;
  5279.         MF3DMeshFacePtr    curMeshFacePtr;
  5280.  
  5281.         MF3D_CommentStrWrite(inMetafilePtr, "nContours");
  5282.  
  5283.         nMeshFaces = meshObj->nFaces + meshObj->nContours;
  5284.         curMeshFacePtr = meshObj->faces;
  5285.         for (faceNum = 0;
  5286.                 result == kMF3DNoErr && faceNum < nMeshFaces;
  5287.                 ++faceNum)
  5288.         {    MF3DUns32        faceVertexNum, nFaceVertexIndices;
  5289.             MF3DUns32Ptr    curFaceVertexPtr;
  5290.  
  5291.             nFaceVertexIndices = curMeshFacePtr->nFaceVertexIndices;
  5292.             if (nFaceVertexIndices <= 2)
  5293.                 result = kMF3DErrTooFewVertices;
  5294.             else
  5295.                 result = MF3D_Uns32Write(inMetafilePtr, nFaceVertexIndices);
  5296.  
  5297.             curFaceVertexPtr = curMeshFacePtr->faceVertexIndices;
  5298.             for (faceVertexNum = 0;
  5299.                     result == kMF3DNoErr && faceVertexNum < nFaceVertexIndices;
  5300.                     ++faceVertexNum)
  5301.             {    result = MF3D_Uns32Write(inMetafilePtr, *curFaceVertexPtr++);
  5302.             }
  5303.             MF3D_CommentNumWrite(inMetafilePtr, faceNum);
  5304.             ++curMeshFacePtr;
  5305.         }
  5306.     }
  5307.  
  5308.     return result;
  5309. }
  5310.  
  5311. /*==============================================================================
  5312.  *    MF3D_ObjMeshDisposer
  5313.  *==============================================================================
  5314.  */
  5315. MF3DErr
  5316. MF3D_ObjMeshDisposer(
  5317.     MF3DVoidObjPtr    inObj)
  5318. {
  5319.     MF3DMeshObjPtr    meshObj;
  5320.  
  5321.     MF3D_VerifyObjectType(inObj, kMF3DObjMesh);
  5322.  
  5323.     meshObj = (MF3DMeshObjPtr) inObj;
  5324.  
  5325.     if (meshObj != NULL)
  5326.     {    if (meshObj->faces != NULL)
  5327.         {    MF3DUns32            numMeshFaces;
  5328.             MF3DMeshFacePtr        curMeshFacePtr;
  5329.  
  5330.             curMeshFacePtr = meshObj->faces;
  5331.             for (numMeshFaces = meshObj->nFaces + meshObj->nContours;
  5332.                     numMeshFaces > 0; --numMeshFaces)
  5333.             {    MF3D_Free(curMeshFacePtr->faceVertexIndices);
  5334.                 ++curMeshFacePtr;
  5335.             }
  5336.             MF3D_Free(meshObj->faces);
  5337.         }
  5338.         MF3D_Free(meshObj->vertices);
  5339.         MF3D_Free(meshObj);
  5340.     }
  5341.  
  5342.     return kMF3DNoErr;
  5343. }
  5344.  
  5345. /*==============================================================================
  5346.  *    MF3D_ObjNURBCurveReader
  5347.  *==============================================================================
  5348.  */
  5349. MF3DErr
  5350. MF3D_ObjNURBCurveReader(
  5351.     MF3D_FilePtr    inMetafilePtr,
  5352.     MF3DVoidObjPtr    *outObj)
  5353. {
  5354.     MF3DNURBCurveObjPtr            returnObj;
  5355.     MF3DUns32                    order;
  5356.     MF3DUns32                    numPoints;
  5357.     MF3DUns32                    numKnots;
  5358.     MF3DErr                        result;
  5359.  
  5360.     result = kMF3DNoErr;
  5361.  
  5362.     MF3D_Allocate(returnObj);
  5363.  
  5364.     if (result == kMF3DNoErr)
  5365.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->order);
  5366.  
  5367.     if (result == kMF3DNoErr)
  5368.     {    order = returnObj->order;
  5369.         if (order < 2)
  5370.             result = kMF3DErrOrderTooSmall;
  5371.     }
  5372.  
  5373.     if (result == kMF3DNoErr)
  5374.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->nPoints);
  5375.  
  5376.     if (result == kMF3DNoErr)
  5377.     {    numPoints = returnObj->nPoints;
  5378.         numKnots = numPoints + order;
  5379.         if (numPoints < 2)
  5380.             result = kMF3DErrTooFewPoints;
  5381.     }
  5382.  
  5383.     if (result == kMF3DNoErr)
  5384.     {    MF3DRationalPoint4DPtr        curPointPtr;
  5385.  
  5386.         returnObj->points = MF3D_Malloc(numPoints *
  5387.                 sizeof(*returnObj->points));
  5388.         if (returnObj->points == NULL)
  5389.             result = kMF3DErrOutOfMemory;
  5390.  
  5391.         curPointPtr = returnObj->points;
  5392.         while (result == kMF3DNoErr && numPoints > 0)
  5393.         {    result = MF3D_RationalPoint4DRead(inMetafilePtr, curPointPtr);
  5394.             --numPoints;
  5395.             ++curPointPtr;
  5396.         }
  5397.  
  5398.         if (result != kMF3DNoErr)
  5399.         {    MF3D_Free(returnObj->points);
  5400.         }
  5401.     }
  5402.  
  5403.     if (result == kMF3DNoErr)
  5404.     {    MF3DKnotPtr        curKnotPtr;
  5405.  
  5406.         returnObj->knots = MF3D_Malloc(numKnots * sizeof(*returnObj->knots));
  5407.         if (returnObj->knots == NULL)
  5408.             result = kMF3DErrOutOfMemory;
  5409.  
  5410.         curKnotPtr = returnObj->knots;
  5411.         while (result == kMF3DNoErr && numKnots > 0)
  5412.         {    result = MF3D_Float32Read(inMetafilePtr, curKnotPtr);
  5413.             --numKnots;
  5414.             ++curKnotPtr;
  5415.         }
  5416.  
  5417.         if (result != kMF3DNoErr)
  5418.         {    MF3D_Free(returnObj->knots);
  5419.         }
  5420.     }
  5421.  
  5422.     if (result == kMF3DNoErr)
  5423.         *outObj = (MF3DVoidObjPtr) returnObj;
  5424.     else
  5425.         MF3D_Free(returnObj);
  5426.  
  5427.     return result;
  5428. }
  5429.  
  5430. /*==============================================================================
  5431.  *    MF3D_ObjNURBCurveWriter
  5432.  *==============================================================================
  5433.  */
  5434. MF3DErr
  5435. MF3D_ObjNURBCurveWriter(
  5436.     MF3D_FilePtr    inMetafilePtr,
  5437.     MF3DVoidObjPtr    inObj)
  5438. {
  5439.     MF3DNURBCurveObjPtr            writeObj;
  5440.     MF3DUns32                    order;
  5441.     MF3DUns32                    numPoints;
  5442.     MF3DUns32                    numKnots;
  5443.     MF3DErr                        result;
  5444.  
  5445.     MF3D_VerifyObjectType(inObj, kMF3DObjNURBCurve);
  5446.     writeObj = (MF3DNURBCurveObjPtr)inObj;
  5447.  
  5448.     result = kMF3DNoErr;
  5449.  
  5450.     numPoints = writeObj->nPoints;
  5451.     order = writeObj->order;
  5452.  
  5453.     if (order < 2)
  5454.         result = kMF3DErrOrderTooSmall;
  5455.  
  5456.     if (result == kMF3DNoErr)
  5457.     {    numKnots = numPoints + order;
  5458.         if (numPoints < 2)
  5459.             result = kMF3DErrTooFewPoints;
  5460.     }
  5461.  
  5462.     if (result == kMF3DNoErr)
  5463.     {    MF3D_WriteNewLine(inMetafilePtr);
  5464.         result = MF3D_Uns32Write(inMetafilePtr, order);
  5465.     }
  5466.  
  5467.     if (result == kMF3DNoErr)
  5468.     {    MF3D_CommentStrWrite(inMetafilePtr, "order");
  5469.         result = MF3D_Uns32Write(inMetafilePtr, numPoints);
  5470.     }
  5471.  
  5472.     if (result == kMF3DNoErr)
  5473.         MF3D_CommentStrWrite(inMetafilePtr, "nPoints");
  5474.  
  5475.     if (result == kMF3DNoErr)
  5476.     {    MF3DRationalPoint4DPtr    curPointPtr;
  5477.         MF3DUns32                pointNum;
  5478.  
  5479.         curPointPtr = writeObj->points;
  5480.         for (pointNum = 0;
  5481.                 result == kMF3DNoErr && pointNum < numPoints;
  5482.                 ++pointNum)
  5483.         {    result = MF3D_RationalPoint4DWrite(inMetafilePtr, *curPointPtr++);
  5484.             if (result == kMF3DNoErr)
  5485.                 MF3D_CommentNumWrite(inMetafilePtr, pointNum);
  5486.         }
  5487.     }
  5488.  
  5489.     if (result == kMF3DNoErr)
  5490.         MF3D_CommentStrWrite(inMetafilePtr, "knots");
  5491.  
  5492.     if (result == kMF3DNoErr)
  5493.     {    MF3DKnotPtr        curKnotPtr;
  5494.         MF3DUns32        knotNum;
  5495.  
  5496.         curKnotPtr = writeObj->knots;
  5497.         for (knotNum = 0;
  5498.                 result == kMF3DNoErr && knotNum < numKnots;
  5499.                 ++knotNum)
  5500.         {    result = MF3D_Float32Write(inMetafilePtr, *curKnotPtr++);
  5501.             if (result == kMF3DNoErr)
  5502.                 MF3D_CommentNumWrite(inMetafilePtr, knotNum);
  5503.         }
  5504.     }
  5505.  
  5506.     return result;
  5507. }
  5508.  
  5509. /*==============================================================================
  5510.  *    MF3D_ObjNURBCurveDisposer
  5511.  *==============================================================================
  5512.  */
  5513. MF3DErr
  5514. MF3D_ObjNURBCurveDisposer(
  5515.     MF3DVoidObjPtr    inObj)
  5516. {
  5517.     MF3D_VerifyObjectType(inObj, kMF3DObjNURBCurve);
  5518.  
  5519.     if (inObj != NULL)
  5520.     {    MF3D_Free(((MF3DNURBCurveObjPtr)inObj)->points);
  5521.         MF3D_Free(((MF3DNURBCurveObjPtr)inObj)->knots);
  5522.         MF3D_Free(inObj);
  5523.     }
  5524.     return kMF3DNoErr;
  5525. }
  5526.  
  5527. /*==============================================================================
  5528.  *    MF3D_ObjNURBPatchReader
  5529.  *==============================================================================
  5530.  */
  5531. MF3DErr
  5532. MF3D_ObjNURBPatchReader(
  5533.     MF3D_FilePtr    inMetafilePtr,
  5534.     MF3DVoidObjPtr    *outObj)
  5535. {
  5536.     MF3DNurbPatchObjPtr            returnObj;
  5537.     MF3DUns32                    uOrder;
  5538.     MF3DUns32                    vOrder;
  5539.     MF3DUns32                    numColumns;
  5540.     MF3DUns32                    numRows;
  5541.     MF3DUns32                    numPoints;
  5542.     MF3DUns32                    numUKnots;
  5543.     MF3DUns32                    numVKnots;
  5544.     MF3DErr                        result;
  5545.  
  5546.     result = kMF3DNoErr;
  5547.  
  5548.     MF3D_Allocate(returnObj);
  5549.  
  5550.     if (result == kMF3DNoErr)
  5551.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->uOrder);
  5552.     if (result == kMF3DNoErr)
  5553.     {    uOrder = returnObj->uOrder;
  5554.         if (uOrder < 2)
  5555.             result = kMF3DErrOrderTooSmall;
  5556.     }
  5557.  
  5558.     if (result == kMF3DNoErr)
  5559.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->vOrder);
  5560.     if (result == kMF3DNoErr)
  5561.     {    vOrder = returnObj->vOrder;
  5562.         if (vOrder < 2)
  5563.             result = kMF3DErrOrderTooSmall;
  5564.     }
  5565.  
  5566.     if (result == kMF3DNoErr)
  5567.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->numColumns);
  5568.     if (result == kMF3DNoErr)
  5569.     {    numColumns = returnObj->numColumns;
  5570.         if (numColumns < 2)
  5571.             result = kMF3DErrTooFewPoints;
  5572.     }
  5573.  
  5574.     if (result == kMF3DNoErr)
  5575.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->numRows);
  5576.     if (result == kMF3DNoErr)
  5577.     {    numRows = returnObj->numRows;
  5578.         if (numRows < 2)
  5579.             result = kMF3DErrTooFewPoints;
  5580.     }
  5581.  
  5582.     if (result == kMF3DNoErr)
  5583.     {    MF3DRationalPoint4DPtr        curPointPtr;
  5584.  
  5585.         numPoints = numColumns * numRows;
  5586.         numUKnots = uOrder + numColumns;
  5587.         numVKnots = vOrder + numRows;
  5588.  
  5589.         returnObj->points = MF3D_Malloc(numPoints * sizeof(*returnObj->points));
  5590.         if (returnObj->points == NULL)
  5591.             result = kMF3DErrOutOfMemory;
  5592.  
  5593.         curPointPtr = returnObj->points;
  5594.         while (result == kMF3DNoErr && numPoints > 0)
  5595.         {    result = MF3D_RationalPoint4DRead(inMetafilePtr, curPointPtr);
  5596.             --numPoints;
  5597.             ++curPointPtr;
  5598.         }
  5599.  
  5600.         if (result != kMF3DNoErr)
  5601.         {    MF3D_Free(returnObj->points);
  5602.         }
  5603.     }
  5604.  
  5605.     if (result == kMF3DNoErr)
  5606.     {    MF3DKnotPtr        curKnotPtr;
  5607.  
  5608.         returnObj->uKnots = MF3D_Malloc(numUKnots * sizeof(*returnObj->uKnots));
  5609.         if (returnObj->uKnots == NULL)
  5610.             result = kMF3DErrOutOfMemory;
  5611.  
  5612.         curKnotPtr = returnObj->uKnots;
  5613.         while (result == kMF3DNoErr && numUKnots > 0)
  5614.         {    result = MF3D_Float32Read(inMetafilePtr, curKnotPtr);
  5615.             --numUKnots;
  5616.             ++curKnotPtr;
  5617.         }
  5618.  
  5619.         if (result != kMF3DNoErr)
  5620.         {    MF3D_Free(returnObj->uKnots);
  5621.         }
  5622.     }
  5623.  
  5624.     if (result == kMF3DNoErr)
  5625.     {    MF3DKnotPtr        curKnotPtr;
  5626.  
  5627.         returnObj->vKnots = MF3D_Malloc(numVKnots * sizeof(*returnObj->vKnots));
  5628.         if (returnObj->vKnots == NULL)
  5629.             result = kMF3DErrOutOfMemory;
  5630.  
  5631.         curKnotPtr = returnObj->vKnots;
  5632.         while (result == kMF3DNoErr && numVKnots > 0)
  5633.         {    result = MF3D_Float32Read(inMetafilePtr, curKnotPtr);
  5634.             --numVKnots;
  5635.             ++curKnotPtr;
  5636.         }
  5637.  
  5638.         if (result != kMF3DNoErr)
  5639.         {    MF3D_Free(returnObj->vKnots);
  5640.         }
  5641.     }
  5642.  
  5643.     if (result == kMF3DNoErr)
  5644.         *outObj = (MF3DVoidObjPtr) returnObj;
  5645.     else
  5646.         MF3D_Free(returnObj);
  5647.  
  5648.     return result;
  5649. }
  5650.  
  5651. /*==============================================================================
  5652.  *    MF3D_ObjNURBPatchWriter
  5653.  *==============================================================================
  5654.  */
  5655. MF3DErr
  5656. MF3D_ObjNURBPatchWriter(
  5657.     MF3D_FilePtr    inMetafilePtr,
  5658.     MF3DVoidObjPtr    inObj)
  5659. {
  5660.     MF3DNurbPatchObjPtr            writeObj;
  5661.     MF3DUns32                    uOrder;
  5662.     MF3DUns32                    vOrder;
  5663.     MF3DUns32                    numColumns;
  5664.     MF3DUns32                    numRows;
  5665.     MF3DUns32                    numPoints;
  5666.     MF3DUns32                    numUKnots;
  5667.     MF3DUns32                    numVKnots;
  5668.     MF3DErr                        result;
  5669.  
  5670.     MF3D_VerifyObjectType(inObj, kMF3DObjNURBPatch);
  5671.     writeObj = (MF3DNurbPatchObjPtr)inObj;
  5672.  
  5673.     result = kMF3DNoErr;
  5674.  
  5675.     uOrder = writeObj->uOrder;
  5676.     if (uOrder < 2)
  5677.         result = kMF3DErrOrderTooSmall;
  5678.  
  5679.     if (result == kMF3DNoErr)
  5680.     {    vOrder = writeObj->vOrder;
  5681.         if (vOrder < 2)
  5682.             result = kMF3DErrOrderTooSmall;
  5683.     }
  5684.  
  5685.     if (result == kMF3DNoErr)
  5686.     {    numColumns = writeObj->numColumns;
  5687.         if (numColumns < 2)
  5688.             result = kMF3DErrTooFewPoints;
  5689.     }
  5690.  
  5691.     if (result == kMF3DNoErr)
  5692.     {    numRows = writeObj->numRows;
  5693.         if (numRows < 2)
  5694.             result = kMF3DErrTooFewPoints;
  5695.     }
  5696.  
  5697.     if (result == kMF3DNoErr)
  5698.     {    MF3D_WriteNewLine(inMetafilePtr);
  5699.         result = MF3D_Uns32Write(inMetafilePtr, uOrder);
  5700.     }
  5701.  
  5702.     if (result == kMF3DNoErr)
  5703.         result = MF3D_Uns32Write(inMetafilePtr, vOrder);
  5704.  
  5705.     if (result == kMF3DNoErr)
  5706.         result = MF3D_Uns32Write(inMetafilePtr, numColumns);
  5707.  
  5708.     if (result == kMF3DNoErr)
  5709.         result = MF3D_Uns32Write(inMetafilePtr, numRows);
  5710.  
  5711.     if (result == kMF3DNoErr)
  5712.     {    MF3DRationalPoint4DPtr    curPointPtr;
  5713.         MF3DUns32                pointNum;
  5714.  
  5715.         MF3D_WriteNewLine(inMetafilePtr);
  5716.  
  5717.         numPoints = numColumns * numRows;
  5718.         numUKnots = uOrder + numColumns;
  5719.         numVKnots = vOrder + numRows;
  5720.  
  5721.         curPointPtr = writeObj->points;
  5722.         for (pointNum = 0;
  5723.                 result == kMF3DNoErr && pointNum < numPoints;
  5724.                 ++pointNum)
  5725.         {    result = MF3D_RationalPoint4DWrite(inMetafilePtr, *curPointPtr++);
  5726.             if (result == kMF3DNoErr)
  5727.                 MF3D_CommentNumWrite(inMetafilePtr, pointNum);
  5728.         }
  5729.     }
  5730.  
  5731.     if (result == kMF3DNoErr)
  5732.     {    MF3DKnotPtr        curKnotPtr;
  5733.         MF3DUns32        knotNum;
  5734.  
  5735.         MF3D_WriteNewLine(inMetafilePtr);
  5736.         MF3D_CommentStrWrite(inMetafilePtr, "uKnots");
  5737.         curKnotPtr = writeObj->uKnots;
  5738.         for (knotNum = 0;
  5739.                 result == kMF3DNoErr && knotNum < numUKnots;
  5740.                 ++knotNum)
  5741.         {    result = MF3D_Float32Write(inMetafilePtr, *curKnotPtr++);
  5742.             if (result == kMF3DNoErr)
  5743.                 MF3D_CommentNumWrite(inMetafilePtr, knotNum);
  5744.         }
  5745.     }
  5746.  
  5747.     if (result == kMF3DNoErr)
  5748.     {    MF3DKnotPtr        curKnotPtr;
  5749.         MF3DUns32        knotNum;
  5750.  
  5751.         MF3D_WriteNewLine(inMetafilePtr);
  5752.         MF3D_CommentStrWrite(inMetafilePtr, "vKnots");
  5753.         curKnotPtr = writeObj->vKnots;
  5754.         for (knotNum = 0;
  5755.                 result == kMF3DNoErr && knotNum < numVKnots;
  5756.                 ++knotNum)
  5757.         {    result = MF3D_Float32Write(inMetafilePtr, *curKnotPtr++);
  5758.             if (result == kMF3DNoErr)
  5759.                 MF3D_CommentNumWrite(inMetafilePtr, knotNum);
  5760.         }
  5761.     }
  5762.  
  5763.     return result;
  5764. }
  5765.  
  5766. /*==============================================================================
  5767.  *    MF3D_ObjNURBPatchDisposer
  5768.  *==============================================================================
  5769.  */
  5770. MF3DErr
  5771. MF3D_ObjNURBPatchDisposer(
  5772.     MF3DVoidObjPtr    inObj)
  5773. {
  5774.     MF3D_VerifyObjectType(inObj, kMF3DObjNURBPatch);
  5775.  
  5776.     if (inObj != NULL)
  5777.     {    MF3D_Free(((MF3DNurbPatchObjPtr)inObj)->points);
  5778.         MF3D_Free(((MF3DNurbPatchObjPtr)inObj)->uKnots);
  5779.         MF3D_Free(((MF3DNurbPatchObjPtr)inObj)->vKnots);
  5780.         MF3D_Free(inObj);
  5781.     }
  5782.     return kMF3DNoErr;
  5783. }
  5784.  
  5785. /*==============================================================================
  5786.  *    MF3D_ObjPointReader
  5787.  *==============================================================================
  5788.  */
  5789. MF3DErr
  5790. MF3D_ObjPointReader(
  5791.     MF3D_FilePtr    inMetafilePtr,
  5792.     MF3DVoidObjPtr    *outObj)
  5793. {
  5794.     MF3DPointObjPtr                returnObj;
  5795.     MF3DErr                        result;
  5796.  
  5797.     result = kMF3DNoErr;
  5798.  
  5799.     MF3D_Allocate(returnObj);
  5800.  
  5801.     if (result == kMF3DNoErr)
  5802.         result = MF3D_Point3DRead(inMetafilePtr, &returnObj->point);
  5803.  
  5804.     if (result == kMF3DNoErr)
  5805.         *outObj = (MF3DVoidObjPtr) returnObj;
  5806.     else
  5807.         MF3D_Free(returnObj);
  5808.  
  5809.     return result;
  5810. }
  5811.  
  5812.  
  5813. /*==============================================================================
  5814.  *    MF3D_ObjPointWriter
  5815.  *==============================================================================
  5816.  */
  5817. MF3DErr
  5818. MF3D_ObjPointWriter(
  5819.     MF3D_FilePtr    inMetafilePtr,
  5820.     MF3DVoidObjPtr    inObj)
  5821. {
  5822.     MF3D_VerifyObjectType(inObj, kMF3DObjPoint);
  5823.     return MF3D_Point3DWrite(inMetafilePtr,
  5824.             ((MF3DPointObjPtr)inObj)->point);
  5825. }
  5826.  
  5827. /*==============================================================================
  5828.  *    MF3D_ObjPointDisposer
  5829.  *==============================================================================
  5830.  */
  5831. MF3DErr
  5832. MF3D_ObjPointDisposer(
  5833.     MF3DVoidObjPtr    inObj)
  5834. {
  5835.     MF3D_VerifyObjectType(inObj, kMF3DObjPoint);
  5836.  
  5837.     MF3D_Free(inObj);
  5838.     return kMF3DNoErr;
  5839. }
  5840.  
  5841. /*==============================================================================
  5842.  *    MF3D_ObjPolygonReader
  5843.  *==============================================================================
  5844.  */
  5845. MF3DErr
  5846. MF3D_ObjPolygonReader(
  5847.     MF3D_FilePtr    inMetafilePtr,
  5848.     MF3DVoidObjPtr    *outObj)
  5849. {
  5850.     MF3DPolygonObjPtr            returnObj;
  5851.     MF3DUns32                    numVertices;
  5852.     MF3DErr                        result;
  5853.  
  5854.     result = kMF3DNoErr;
  5855.  
  5856.     MF3D_Allocate(returnObj);
  5857.  
  5858.     if (result == kMF3DNoErr)
  5859.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->nVertices);
  5860.  
  5861.     if (result == kMF3DNoErr)
  5862.     {    numVertices = returnObj->nVertices;
  5863.         if (numVertices <= 2)
  5864.             result = kMF3DErrTooFewVertices;
  5865.     }
  5866.  
  5867.     if (result == kMF3DNoErr)
  5868.     {    MF3DPoint3DPtr    curVertexPtr;
  5869.  
  5870.         returnObj->vertices = MF3D_Malloc(numVertices *
  5871.                 sizeof(*returnObj->vertices));
  5872.         if (returnObj->vertices == NULL)
  5873.             result = kMF3DErrOutOfMemory;
  5874.  
  5875.         curVertexPtr = returnObj->vertices;
  5876.         while (result == kMF3DNoErr && numVertices > 0)
  5877.         {    result = MF3D_Point3DRead(inMetafilePtr, curVertexPtr);
  5878.             --numVertices;
  5879.             ++curVertexPtr;
  5880.         }
  5881.  
  5882.         if (result != kMF3DNoErr)
  5883.             MF3D_Free(returnObj->vertices);
  5884.     }
  5885.  
  5886.     if (result == kMF3DNoErr)
  5887.         *outObj = (MF3DVoidObjPtr) returnObj;
  5888.     else
  5889.         MF3D_Free(returnObj);
  5890.  
  5891.     return result;
  5892. }
  5893.  
  5894.  
  5895. /*==============================================================================
  5896.  *    MF3D_ObjPolygonWriter
  5897.  *==============================================================================
  5898.  */
  5899. MF3DErr
  5900. MF3D_ObjPolygonWriter(
  5901.     MF3D_FilePtr    inMetafilePtr,
  5902.     MF3DVoidObjPtr    inObj)
  5903. {
  5904.     MF3DPolygonObjPtr            writeObj;
  5905.     MF3DUns32                    numVertices;
  5906.     MF3DErr                        result;
  5907.  
  5908.     MF3D_VerifyObjectType(inObj, kMF3DObjPolygon);
  5909.     writeObj = (MF3DPolygonObjPtr)inObj;
  5910.  
  5911.     result = kMF3DNoErr;
  5912.  
  5913.     numVertices = writeObj->nVertices;
  5914.     if (numVertices <= 2)
  5915.         result = kMF3DErrTooFewVertices;
  5916.  
  5917.     if (result == kMF3DNoErr)
  5918.     {    MF3D_WriteNewLine(inMetafilePtr);
  5919.         result = MF3D_Uns32Write(inMetafilePtr, numVertices);
  5920.     }
  5921.  
  5922.     if (result == kMF3DNoErr)
  5923.     {    MF3DPoint3DPtr    curVertexPtr;
  5924.         MF3DUns32        vertexNum;
  5925.  
  5926.         MF3D_CommentStrWrite(inMetafilePtr, "nVertices");
  5927.         curVertexPtr = writeObj->vertices;
  5928.         for (vertexNum = 0;
  5929.                 result == kMF3DNoErr && vertexNum < numVertices;
  5930.                 ++vertexNum)
  5931.         {    result = MF3D_Point3DWrite(inMetafilePtr, *curVertexPtr++);
  5932.             if (result == kMF3DNoErr)
  5933.                 MF3D_CommentNumWrite(inMetafilePtr, vertexNum);
  5934.         }
  5935.     }
  5936.  
  5937.     return result;
  5938. }
  5939.  
  5940. /*==============================================================================
  5941.  *    MF3D_ObjPolygonDisposer
  5942.  *==============================================================================
  5943.  */
  5944. MF3DErr
  5945. MF3D_ObjPolygonDisposer(
  5946.     MF3DVoidObjPtr    inObj)
  5947. {
  5948.     MF3D_VerifyObjectType(inObj, kMF3DObjPolygon);
  5949.  
  5950.     if (inObj != NULL)
  5951.     {    MF3D_Free(((MF3DPolygonObjPtr)inObj)->vertices);
  5952.         MF3D_Free(inObj);
  5953.     }
  5954.     return kMF3DNoErr;
  5955. }
  5956.  
  5957. /*==============================================================================
  5958.  *    MF3D_ObjPolyLineReader
  5959.  *==============================================================================
  5960.  */
  5961. MF3DErr
  5962. MF3D_ObjPolyLineReader(
  5963.     MF3D_FilePtr    inMetafilePtr,
  5964.     MF3DVoidObjPtr    *outObj)
  5965. {
  5966.     MF3DPolyLineObjPtr            returnObj;
  5967.     MF3DUns32                    numVertices;
  5968.     MF3DErr                        result;
  5969.  
  5970.     result = kMF3DNoErr;
  5971.  
  5972.     MF3D_Allocate(returnObj);
  5973.  
  5974.     if (result == kMF3DNoErr)
  5975.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->nVertices);
  5976.  
  5977.     if (result == kMF3DNoErr)
  5978.     {    numVertices = returnObj->nVertices;
  5979.         if (numVertices <= 2)
  5980.             result = kMF3DErrTooFewVertices;
  5981.     }
  5982.  
  5983.     if (result == kMF3DNoErr)
  5984.     {    MF3DPoint3DPtr    curVertexPtr;
  5985.  
  5986.         returnObj->vertices = MF3D_Malloc(numVertices *
  5987.                 sizeof(*returnObj->vertices));
  5988.         if (returnObj->vertices == NULL)
  5989.             result = kMF3DErrOutOfMemory;
  5990.  
  5991.         curVertexPtr = returnObj->vertices;
  5992.         while (result == kMF3DNoErr && numVertices > 0)
  5993.         {    result = MF3D_Point3DRead(inMetafilePtr, curVertexPtr);
  5994.             --numVertices;
  5995.             ++curVertexPtr;
  5996.         }
  5997.  
  5998.         if (result != kMF3DNoErr)
  5999.             MF3D_Free(returnObj->vertices);
  6000.     }
  6001.  
  6002.     if (result == kMF3DNoErr)
  6003.         *outObj = (MF3DVoidObjPtr) returnObj;
  6004.     else
  6005.         MF3D_Free(returnObj);
  6006.  
  6007.     return result;
  6008. }
  6009.  
  6010.  
  6011. /*==============================================================================
  6012.  *    MF3D_ObjPolyLineWriter
  6013.  *==============================================================================
  6014.  */
  6015. MF3DErr
  6016. MF3D_ObjPolyLineWriter(
  6017.     MF3D_FilePtr    inMetafilePtr,
  6018.     MF3DVoidObjPtr    inObj)
  6019. {
  6020.     MF3DPolyLineObjPtr            writeObj;
  6021.     MF3DUns32                    numVertices;
  6022.     MF3DErr                        result;
  6023.  
  6024.     MF3D_VerifyObjectType(inObj, kMF3DObjPolyLine);
  6025.     writeObj = (MF3DPolyLineObjPtr)inObj;
  6026.  
  6027.     result = kMF3DNoErr;
  6028.  
  6029.     numVertices = writeObj->nVertices;
  6030.     if (numVertices <= 2)
  6031.         result = kMF3DErrTooFewVertices;
  6032.  
  6033.     if (result == kMF3DNoErr)
  6034.     {    MF3D_WriteNewLine(inMetafilePtr);
  6035.         result = MF3D_Uns32Write(inMetafilePtr, writeObj->nVertices);
  6036.     }
  6037.  
  6038.     if (result == kMF3DNoErr)
  6039.     {    MF3DPoint3DPtr    curVertexPtr;
  6040.         MF3DUns32        vertexNum;
  6041.  
  6042.         MF3D_CommentStrWrite(inMetafilePtr, "nVertices");
  6043.         curVertexPtr = writeObj->vertices;
  6044.         for (vertexNum = 0;
  6045.                 result == kMF3DNoErr && vertexNum < numVertices;
  6046.                 ++vertexNum)
  6047.         {    result = MF3D_Point3DWrite(inMetafilePtr, *curVertexPtr++);
  6048.             if (result == kMF3DNoErr)
  6049.                 MF3D_CommentNumWrite(inMetafilePtr, vertexNum);
  6050.         }
  6051.     }
  6052.  
  6053.     return result;
  6054. }
  6055.  
  6056. /*==============================================================================
  6057.  *    MF3D_ObjPolyLineDisposer
  6058.  *==============================================================================
  6059.  */
  6060. MF3DErr
  6061. MF3D_ObjPolyLineDisposer(
  6062.     MF3DVoidObjPtr    inObj)
  6063. {
  6064.     MF3D_VerifyObjectType(inObj, kMF3DObjPolyLine);
  6065.  
  6066.     if (inObj != NULL)
  6067.     {    MF3D_Free(((MF3DPolyLineObjPtr)inObj)->vertices);
  6068.         MF3D_Free(inObj);
  6069.     }
  6070.     return kMF3DNoErr;
  6071. }
  6072.  
  6073. /*==============================================================================
  6074.  *    MF3D_ObjTorusReader
  6075.  *==============================================================================
  6076.  */
  6077. MF3DErr
  6078. MF3D_ObjTorusReader(
  6079.     MF3D_FilePtr    inMetafilePtr,
  6080.     MF3DVoidObjPtr    *outObj)
  6081. {
  6082.     MF3DTorusObjPtr                returnObj;
  6083.     MF3DVector3D                vector;
  6084.     MF3DErr                        numberExists;
  6085.     MF3DErr                        result;
  6086.  
  6087.     result = kMF3DNoErr;
  6088.  
  6089.     MF3D_Allocate(returnObj);
  6090.  
  6091.     if (result == kMF3DNoErr)
  6092.     {    returnObj->torus = NULL;
  6093.  
  6094.         numberExists = MF3D_Vector3DRead(inMetafilePtr, &vector);
  6095.     }
  6096.  
  6097.     if (result == kMF3DNoErr && numberExists == kMF3DNoErr)
  6098.     {    MF3D_Allocate(returnObj->torus);
  6099.  
  6100.         returnObj->torus->orientation.x = vector.x;
  6101.         returnObj->torus->orientation.y = vector.y;
  6102.         returnObj->torus->orientation.z = vector.z;
  6103.  
  6104.         if (result == kMF3DNoErr)
  6105.         {    result = MF3D_Vector3DRead(inMetafilePtr,
  6106.                     &returnObj->torus->majorAxis);
  6107.         }
  6108.  
  6109.         if (result == kMF3DNoErr)
  6110.         {    result = MF3D_Vector3DRead(inMetafilePtr,
  6111.                     &returnObj->torus->minorAxis);
  6112.         }
  6113.  
  6114.         if (result == kMF3DNoErr)
  6115.             result = MF3D_Point3DRead(inMetafilePtr, &returnObj->torus->origin);
  6116.  
  6117.         if (result == kMF3DNoErr)
  6118.             result = MF3D_Float32Read(inMetafilePtr, &returnObj->torus->ratio);
  6119.     }
  6120.  
  6121.     if (result == kMF3DNoErr)
  6122.         *outObj = (MF3DVoidObjPtr) returnObj;
  6123.     else
  6124.         MF3D_Free(returnObj);
  6125.  
  6126.     return result;
  6127. }
  6128.  
  6129.  
  6130. /*==============================================================================
  6131.  *    MF3D_ObjTorusWriter
  6132.  *==============================================================================
  6133.  */
  6134. MF3DErr
  6135. MF3D_ObjTorusWriter(
  6136.     MF3D_FilePtr    inMetafilePtr,
  6137.     MF3DVoidObjPtr    inObj)
  6138. {
  6139.     MF3DTorusObjPtr                writeObj;
  6140.     MF3DErr                        result;
  6141.  
  6142.     MF3D_VerifyObjectType(inObj, kMF3DObjTorus);
  6143.     writeObj = (MF3DTorusObjPtr)inObj;
  6144.  
  6145.     result = kMF3DNoErr;
  6146.  
  6147.     if (writeObj->torus != NULL)
  6148.     {    MF3D_WriteNewLine(inMetafilePtr);
  6149.         result = MF3D_Vector3DWrite(inMetafilePtr,
  6150.                 writeObj->torus->orientation);
  6151.  
  6152.         if (result == kMF3DNoErr)
  6153.         {    MF3D_WriteNewLine(inMetafilePtr);
  6154.             result = MF3D_Vector3DWrite(inMetafilePtr,
  6155.                     writeObj->torus->majorAxis);
  6156.         }
  6157.  
  6158.         if (result == kMF3DNoErr)
  6159.         {    MF3D_WriteNewLine(inMetafilePtr);
  6160.             result = MF3D_Vector3DWrite(inMetafilePtr,
  6161.                     writeObj->torus->minorAxis);
  6162.         }
  6163.  
  6164.         if (result == kMF3DNoErr)
  6165.         {    MF3D_WriteNewLine(inMetafilePtr);
  6166.             result = MF3D_Point3DWrite(inMetafilePtr,
  6167.                     writeObj->torus->origin);
  6168.         }
  6169.  
  6170.         if (result == kMF3DNoErr)
  6171.         {    MF3D_WriteNewLine(inMetafilePtr);
  6172.             result = MF3D_Float32Write(inMetafilePtr,
  6173.                     writeObj->torus->ratio);
  6174.         }
  6175.  
  6176.         if (result == kMF3DNoErr)
  6177.             MF3D_WriteNewLine(inMetafilePtr);
  6178.     }
  6179.  
  6180.     return result;
  6181. }
  6182.  
  6183. /*==============================================================================
  6184.  *    MF3D_ObjTorusDisposer
  6185.  *==============================================================================
  6186.  */
  6187. MF3DErr
  6188. MF3D_ObjTorusDisposer(
  6189.     MF3DVoidObjPtr    inObj)
  6190. {
  6191.     MF3D_VerifyObjectType(inObj, kMF3DObjTorus);
  6192.  
  6193.     if (inObj != NULL)
  6194.     {    MF3D_Free(((MF3DTorusObjPtr)inObj)->torus);
  6195.         MF3D_Free(inObj);
  6196.     }
  6197.  
  6198.     return kMF3DNoErr;
  6199. }
  6200.  
  6201. /*==============================================================================
  6202.  *    MF3D_ObjTriangleReader
  6203.  *==============================================================================
  6204.  */
  6205. MF3DErr
  6206. MF3D_ObjTriangleReader(
  6207.     MF3D_FilePtr    inMetafilePtr,
  6208.     MF3DVoidObjPtr    *outObj)
  6209. {
  6210.     MF3DTriangleObjPtr            returnObj;
  6211.     MF3DErr                        result;
  6212.  
  6213.     result = kMF3DNoErr;
  6214.  
  6215.     MF3D_Allocate(returnObj);
  6216.  
  6217.     if (result == kMF3DNoErr)
  6218.         result = MF3D_Point3DRead(inMetafilePtr, &returnObj->vertex1);
  6219.  
  6220.     if (result == kMF3DNoErr)
  6221.         result = MF3D_Point3DRead(inMetafilePtr, &returnObj->vertex2);
  6222.  
  6223.     if (result == kMF3DNoErr)
  6224.         result = MF3D_Point3DRead(inMetafilePtr, &returnObj->vertex3);
  6225.  
  6226.     if (result == kMF3DNoErr)
  6227.         *outObj = (MF3DVoidObjPtr) returnObj;
  6228.     else
  6229.         MF3D_Free(returnObj);
  6230.  
  6231.     return result;
  6232. }
  6233.  
  6234.  
  6235. /*==============================================================================
  6236.  *    MF3D_ObjTriangleWriter
  6237.  *==============================================================================
  6238.  */
  6239. MF3DErr
  6240. MF3D_ObjTriangleWriter(
  6241.     MF3D_FilePtr    inMetafilePtr,
  6242.     MF3DVoidObjPtr    inObj)
  6243. {
  6244.     MF3DTriangleObjPtr            writeObj;
  6245.     MF3DErr                        result;
  6246.  
  6247.     MF3D_VerifyObjectType(inObj, kMF3DObjTriangle);
  6248.     writeObj = (MF3DTriangleObjPtr)inObj;
  6249.  
  6250.     MF3D_WriteNewLine(inMetafilePtr);
  6251.     result = MF3D_Point3DWrite(inMetafilePtr, writeObj->vertex1);
  6252.  
  6253.     if (result == kMF3DNoErr)
  6254.     {    MF3D_WriteNewLine(inMetafilePtr);
  6255.         result = MF3D_Point3DWrite(inMetafilePtr, writeObj->vertex2);
  6256.     }
  6257.  
  6258.     if (result == kMF3DNoErr)
  6259.     {    MF3D_WriteNewLine(inMetafilePtr);
  6260.         result = MF3D_Point3DWrite(inMetafilePtr, writeObj->vertex3);
  6261.     }
  6262.  
  6263.     if (result == kMF3DNoErr)
  6264.         MF3D_WriteNewLine(inMetafilePtr);
  6265.  
  6266.     return result;
  6267. }
  6268.  
  6269. /*==============================================================================
  6270.  *    MF3D_ObjTriangleDisposer
  6271.  *==============================================================================
  6272.  */
  6273. MF3DErr
  6274. MF3D_ObjTriangleDisposer(
  6275.     MF3DVoidObjPtr    inObj)
  6276. {
  6277.     MF3D_VerifyObjectType(inObj, kMF3DObjTriangle);
  6278.  
  6279.     MF3D_Free(inObj);
  6280.     return kMF3DNoErr;
  6281. }
  6282.  
  6283. /*==============================================================================
  6284.  *    MF3D_ObjTriGridReader
  6285.  *==============================================================================
  6286.  */
  6287. MF3DErr
  6288. MF3D_ObjTriGridReader(
  6289.     MF3D_FilePtr    inMetafilePtr,
  6290.     MF3DVoidObjPtr    *outObj)
  6291. {
  6292.     MF3DTriGridObjPtr            returnObj;
  6293.     MF3DUns32                    numRows, numColumns;
  6294.     MF3DUns32                    numVertices;
  6295.     MF3DErr                        result;
  6296.  
  6297.     result = kMF3DNoErr;
  6298.  
  6299.     MF3D_Allocate(returnObj);
  6300.  
  6301.     if (result == kMF3DNoErr)
  6302.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->numRows);
  6303.     if (result == kMF3DNoErr)
  6304.     {    numRows = returnObj->numRows;
  6305.         if (numRows < 2)
  6306.             result = kMF3DErrTooFewVertices;
  6307.     }
  6308.  
  6309.     if (result == kMF3DNoErr)
  6310.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->numColumns);
  6311.     if (result == kMF3DNoErr)
  6312.     {    numColumns = returnObj->numColumns;
  6313.         if (numColumns < 2)
  6314.             result = kMF3DErrTooFewVertices;
  6315.     }
  6316.  
  6317.     if (result == kMF3DNoErr)
  6318.     {    MF3DPoint3DPtr        curVertexPtr;
  6319.  
  6320.         numVertices = numColumns * numRows;
  6321.  
  6322.         returnObj->vertices = MF3D_Malloc(numVertices *
  6323.                 sizeof(*returnObj->vertices));
  6324.         if (returnObj->vertices == NULL)
  6325.             result = kMF3DErrOutOfMemory;
  6326.  
  6327.         curVertexPtr = returnObj->vertices;
  6328.         while (result == kMF3DNoErr && numVertices > 0)
  6329.         {    result = MF3D_Point3DRead(inMetafilePtr, curVertexPtr);
  6330.             --numVertices;
  6331.             ++curVertexPtr;
  6332.         }
  6333.  
  6334.         if (result != kMF3DNoErr)
  6335.         {    MF3D_Free(returnObj->vertices);
  6336.         }
  6337.     }
  6338.  
  6339.     if (result == kMF3DNoErr)
  6340.         *outObj = (MF3DVoidObjPtr) returnObj;
  6341.     else
  6342.         MF3D_Free(returnObj);
  6343.  
  6344.     return result;
  6345. }
  6346.  
  6347.  
  6348. /*==============================================================================
  6349.  *    MF3D_ObjTriGridWriter
  6350.  *==============================================================================
  6351.  */
  6352. MF3DErr
  6353. MF3D_ObjTriGridWriter(
  6354.     MF3D_FilePtr    inMetafilePtr,
  6355.     MF3DVoidObjPtr    inObj)
  6356. {
  6357.     MF3DTriGridObjPtr            writeObj;
  6358.     MF3DUns32                    numRows, numColumns;
  6359.     MF3DUns32                    numVertices;
  6360.     MF3DErr                        result;
  6361.  
  6362.     MF3D_VerifyObjectType(inObj, kMF3DObjTriGrid);
  6363.     writeObj = (MF3DTriGridObjPtr)inObj;
  6364.  
  6365.     result = kMF3DNoErr;
  6366.  
  6367.     numRows = writeObj->numRows;
  6368.     if (numRows < 2)
  6369.         result = kMF3DErrTooFewVertices;
  6370.  
  6371.     if (result == kMF3DNoErr)
  6372.     {    numColumns = writeObj->numColumns;
  6373.         if (numColumns < 2)
  6374.             result = kMF3DErrTooFewVertices;
  6375.     }
  6376.  
  6377.     if (result == kMF3DNoErr)
  6378.     {    MF3D_CommentStrWrite(inMetafilePtr, "numRows");
  6379.         result = MF3D_Uns32Write(inMetafilePtr, numRows);
  6380.     }
  6381.  
  6382.     if (result == kMF3DNoErr)
  6383.         result = MF3D_Uns32Write(inMetafilePtr, numColumns);
  6384.  
  6385.     if (result == kMF3DNoErr)
  6386.     {    MF3DPoint3DPtr        curVertexPtr;
  6387.         MF3DUns32            vertexNum;
  6388.  
  6389.         numVertices = numColumns * numRows;
  6390.  
  6391.         MF3D_CommentStrWrite(inMetafilePtr, "numColumns");
  6392.  
  6393.         curVertexPtr = writeObj->vertices;
  6394.         for (vertexNum = 0;
  6395.                 result == kMF3DNoErr && vertexNum < numVertices;
  6396.                 ++vertexNum)
  6397.         {    result = MF3D_Point3DWrite(inMetafilePtr, *curVertexPtr++);
  6398.             if (result == kMF3DNoErr)
  6399.                 MF3D_CommentNumWrite(inMetafilePtr, vertexNum);
  6400.         }
  6401.     }
  6402.  
  6403.     return result;
  6404. }
  6405.  
  6406. /*==============================================================================
  6407.  *    MF3D_ObjTriGridDisposer
  6408.  *==============================================================================
  6409.  */
  6410. MF3DErr
  6411. MF3D_ObjTriGridDisposer(
  6412.     MF3DVoidObjPtr    inObj)
  6413. {
  6414.     MF3D_VerifyObjectType(inObj, kMF3DObjTriGrid);
  6415.  
  6416.     if (inObj != NULL)
  6417.     {    MF3D_Free(((MF3DTriGridObjPtr)inObj)->vertices);
  6418.         MF3D_Free(inObj);
  6419.     }
  6420.     return kMF3DNoErr;
  6421. }
  6422.  
  6423. /*==============================================================================
  6424.  *    MF3D_ObjGroupReader
  6425.  *==============================================================================
  6426.  */
  6427. MF3DErr
  6428. MF3D_ObjGroupReader(
  6429.     MF3D_FilePtr    inMetafilePtr,
  6430.     MF3DVoidObjPtr    *outObj)
  6431. {
  6432.     MF3DGroupObjPtr                returnObj;
  6433.     MF3DErr                        result;
  6434.  
  6435.     MF3D_Unused(inMetafilePtr);
  6436.  
  6437.     result = kMF3DNoErr;
  6438.  
  6439.     MF3D_Allocate(returnObj);
  6440.  
  6441.     if (result == kMF3DNoErr)
  6442.         *outObj = (MF3DVoidObjPtr) returnObj;
  6443.     else
  6444.         MF3D_Free(returnObj);
  6445.  
  6446.     return result;
  6447. }
  6448.  
  6449. /*==============================================================================
  6450.  *    MF3D_ObjGroupWriter
  6451.  *==============================================================================
  6452.  */
  6453. MF3DErr
  6454. MF3D_ObjGroupWriter(
  6455.     MF3D_FilePtr    inMetafilePtr,
  6456.     MF3DVoidObjPtr    inObj)
  6457. {
  6458.     MF3D_VerifyObjectType(inObj, kMF3DObjGroup);
  6459.     MF3D_Unused(inMetafilePtr);
  6460.     MF3D_Unused(inObj);
  6461.     /* Nothing to write! */
  6462.     return kMF3DNoErr;
  6463. }
  6464.  
  6465. /*==============================================================================
  6466.  *    MF3D_ObjGroupDisposer
  6467.  *==============================================================================
  6468.  */
  6469. MF3DErr
  6470. MF3D_ObjGroupDisposer(
  6471.     MF3DVoidObjPtr    inObj)
  6472. {
  6473.     MF3D_VerifyObjectType(inObj, kMF3DObjGroup);
  6474.  
  6475.     MF3D_Free(inObj);
  6476.     return kMF3DNoErr;
  6477. }
  6478.  
  6479. /*==============================================================================
  6480.  *    MF3D_ObjDisplayGroupReader
  6481.  *==============================================================================
  6482.  */
  6483. MF3DErr
  6484. MF3D_ObjDisplayGroupReader(
  6485.     MF3D_FilePtr    inMetafilePtr,
  6486.     MF3DVoidObjPtr    *outObj)
  6487. {
  6488.     MF3DDisplayGroupObjPtr        returnObj;
  6489.     MF3DErr                        result;
  6490.  
  6491.     MF3D_Unused(inMetafilePtr);
  6492.  
  6493.     result = kMF3DNoErr;
  6494.  
  6495.     MF3D_Allocate(returnObj);
  6496.  
  6497.     if (result == kMF3DNoErr)
  6498.         *outObj = (MF3DVoidObjPtr) returnObj;
  6499.     else
  6500.         MF3D_Free(returnObj);
  6501.  
  6502.     return result;
  6503. }
  6504.  
  6505.  
  6506. /*==============================================================================
  6507.  *    MF3D_ObjDisplayGroupWriter
  6508.  *==============================================================================
  6509.  */
  6510. MF3DErr
  6511. MF3D_ObjDisplayGroupWriter(
  6512.     MF3D_FilePtr    inMetafilePtr,
  6513.     MF3DVoidObjPtr    inObj)
  6514. {
  6515.     MF3D_VerifyObjectType(inObj, kMF3DObjDisplayGroup);
  6516.     MF3D_Unused(inMetafilePtr);
  6517.     MF3D_Unused(inObj);
  6518.     /* Nothing to write! */
  6519.     return kMF3DNoErr;
  6520. }
  6521.  
  6522. /*==============================================================================
  6523.  *    MF3D_ObjDisplayGroupDisposer
  6524.  *==============================================================================
  6525.  */
  6526. MF3DErr
  6527. MF3D_ObjDisplayGroupDisposer(
  6528.     MF3DVoidObjPtr    inObj)
  6529. {
  6530.     MF3D_VerifyObjectType(inObj, kMF3DObjDisplayGroup);
  6531.  
  6532.     MF3D_Free(inObj);
  6533.     return kMF3DNoErr;
  6534. }
  6535.  
  6536. /*==============================================================================
  6537.  *    MF3D_ObjIOProxyDisplayGroupReader
  6538.  *==============================================================================
  6539.  */
  6540. MF3DErr
  6541. MF3D_ObjIOProxyDisplayGroupReader(
  6542.     MF3D_FilePtr    inMetafilePtr,
  6543.     MF3DVoidObjPtr    *outObj)
  6544. {
  6545.     MF3DIOProxyDisplayGroupObjPtr    returnObj;
  6546.     MF3DErr                        result;
  6547.  
  6548.     MF3D_Unused(inMetafilePtr);
  6549.  
  6550.     result = kMF3DNoErr;
  6551.  
  6552.     MF3D_Allocate(returnObj);
  6553.  
  6554.     if (result == kMF3DNoErr)
  6555.         *outObj = (MF3DVoidObjPtr) returnObj;
  6556.     else
  6557.         MF3D_Free(returnObj);
  6558.  
  6559.     return result;
  6560. }
  6561.  
  6562.  
  6563. /*==============================================================================
  6564.  *    MF3D_ObjIOProxyDisplayGroupWriter
  6565.  *==============================================================================
  6566.  */
  6567. MF3DErr
  6568. MF3D_ObjIOProxyDisplayGroupWriter(
  6569.     MF3D_FilePtr    inMetafilePtr,
  6570.     MF3DVoidObjPtr    inObj)
  6571. {
  6572.     MF3D_VerifyObjectType(inObj, kMF3DObjIOProxyDisplayGroup);
  6573.     MF3D_Unused(inMetafilePtr);
  6574.     MF3D_Unused(inObj);
  6575.     /* Nothing to write! */
  6576.     return kMF3DNoErr;
  6577. }
  6578.  
  6579. /*==============================================================================
  6580.  *    MF3D_ObjIOProxyDisplayGroupDisposer
  6581.  *==============================================================================
  6582.  */
  6583. MF3DErr
  6584. MF3D_ObjIOProxyDisplayGroupDisposer(
  6585.     MF3DVoidObjPtr    inObj)
  6586. {
  6587.     MF3D_VerifyObjectType(inObj, kMF3DObjIOProxyDisplayGroup);
  6588.  
  6589.     MF3D_Free(inObj);
  6590.     return kMF3DNoErr;
  6591. }
  6592.  
  6593. /*==============================================================================
  6594.  *    MF3D_ObjOrderedDisplayGroupReader
  6595.  *==============================================================================
  6596.  */
  6597. MF3DErr
  6598. MF3D_ObjOrderedDisplayGroupReader(
  6599.     MF3D_FilePtr    inMetafilePtr,
  6600.     MF3DVoidObjPtr    *outObj)
  6601. {
  6602.     MF3DOrderedDisplayGroupObjPtr    returnObj;
  6603.     MF3DErr                        result;
  6604.  
  6605.     MF3D_Unused(inMetafilePtr);
  6606.  
  6607.     result = kMF3DNoErr;
  6608.  
  6609.     MF3D_Allocate(returnObj);
  6610.  
  6611.     if (result == kMF3DNoErr)
  6612.         *outObj = (MF3DVoidObjPtr) returnObj;
  6613.     else
  6614.         MF3D_Free(returnObj);
  6615.  
  6616.     return result;
  6617. }
  6618.  
  6619. /*==============================================================================
  6620.  *    MF3D_ObjOrderedDisplayGroupWriter
  6621.  *==============================================================================
  6622.  */
  6623. MF3DErr
  6624. MF3D_ObjOrderedDisplayGroupWriter(
  6625.     MF3D_FilePtr    inMetafilePtr,
  6626.     MF3DVoidObjPtr    inObj)
  6627. {
  6628.     MF3D_VerifyObjectType(inObj, kMF3DObjOrderedDisplayGroup);
  6629.     MF3D_Unused(inMetafilePtr);
  6630.     MF3D_Unused(inObj);
  6631.     /* Nothing to write! */
  6632.     return kMF3DNoErr;
  6633. }
  6634.  
  6635. /*==============================================================================
  6636.  *    MF3D_ObjOrderedDisplayGroupDisposer
  6637.  *==============================================================================
  6638.  */
  6639. MF3DErr
  6640. MF3D_ObjOrderedDisplayGroupDisposer(
  6641.     MF3DVoidObjPtr    inObj)
  6642. {
  6643.     MF3D_VerifyObjectType(inObj, kMF3DObjOrderedDisplayGroup);
  6644.  
  6645.     MF3D_Free(inObj);
  6646.     return kMF3DNoErr;
  6647. }
  6648.  
  6649. /*==============================================================================
  6650.  *    MF3D_ObjInfoGroupReader
  6651.  *==============================================================================
  6652.  */
  6653. MF3DErr
  6654. MF3D_ObjInfoGroupReader(
  6655.     MF3D_FilePtr    inMetafilePtr,
  6656.     MF3DVoidObjPtr    *outObj)
  6657. {
  6658.     MF3DInfoGroupObjPtr            returnObj;
  6659.     MF3DErr                        result;
  6660.  
  6661.     MF3D_Unused(inMetafilePtr);
  6662.  
  6663.     result = kMF3DNoErr;
  6664.  
  6665.     MF3D_Allocate(returnObj);
  6666.  
  6667.     if (result == kMF3DNoErr)
  6668.         *outObj = (MF3DVoidObjPtr) returnObj;
  6669.     else
  6670.         MF3D_Free(returnObj);
  6671.  
  6672.     return result;
  6673. }
  6674.  
  6675. /*==============================================================================
  6676.  *    MF3D_ObjInfoGroupWriter
  6677.  *==============================================================================
  6678.  */
  6679. MF3DErr
  6680. MF3D_ObjInfoGroupWriter(
  6681.     MF3D_FilePtr    inMetafilePtr,
  6682.     MF3DVoidObjPtr    inObj)
  6683. {
  6684.     MF3D_VerifyObjectType(inObj, kMF3DObjInfoGroup);
  6685.     MF3D_Unused(inMetafilePtr);
  6686.     MF3D_Unused(inObj);
  6687.     /* Nothing to write! */
  6688.     return kMF3DNoErr;
  6689. }
  6690.  
  6691. /*==============================================================================
  6692.  *    MF3D_ObjInfoGroupDisposer
  6693.  *==============================================================================
  6694.  */
  6695. MF3DErr
  6696. MF3D_ObjInfoGroupDisposer(
  6697.     MF3DVoidObjPtr    inObj)
  6698. {
  6699.     MF3D_VerifyObjectType(inObj, kMF3DObjInfoGroup);
  6700.  
  6701.     MF3D_Free(inObj);
  6702.     return kMF3DNoErr;
  6703. }
  6704.  
  6705. /*==============================================================================
  6706.  *    MF3D_ObjLightGroupReader
  6707.  *==============================================================================
  6708.  */
  6709. MF3DErr
  6710. MF3D_ObjLightGroupReader(
  6711.     MF3D_FilePtr    inMetafilePtr,
  6712.     MF3DVoidObjPtr    *outObj)
  6713. {
  6714.     MF3DLightGroupObjPtr        returnObj;
  6715.     MF3DErr                        result;
  6716.  
  6717.     MF3D_Unused(inMetafilePtr);
  6718.  
  6719.     result = kMF3DNoErr;
  6720.  
  6721.     MF3D_Allocate(returnObj);
  6722.  
  6723.     if (result == kMF3DNoErr)
  6724.         *outObj = (MF3DVoidObjPtr) returnObj;
  6725.     else
  6726.         MF3D_Free(returnObj);
  6727.  
  6728.     return result;
  6729. }
  6730.  
  6731. /*==============================================================================
  6732.  *    MF3D_ObjLightGroupWriter
  6733.  *==============================================================================
  6734.  */
  6735. MF3DErr
  6736. MF3D_ObjLightGroupWriter(
  6737.     MF3D_FilePtr    inMetafilePtr,
  6738.     MF3DVoidObjPtr    inObj)
  6739. {
  6740.     MF3D_VerifyObjectType(inObj, kMF3DObjLightGroup);
  6741.     MF3D_Unused(inMetafilePtr);
  6742.     MF3D_Unused(inObj);
  6743.     /* Nothing to write! */
  6744.     return kMF3DNoErr;
  6745. }
  6746.  
  6747. /*==============================================================================
  6748.  *    MF3D_ObjLightGroupDisposer
  6749.  *==============================================================================
  6750.  */
  6751. MF3DErr
  6752. MF3D_ObjLightGroupDisposer(
  6753.     MF3DVoidObjPtr    inObj)
  6754. {
  6755.     MF3D_VerifyObjectType(inObj, kMF3DObjLightGroup);
  6756.  
  6757.     MF3D_Free(inObj);
  6758.     return kMF3DNoErr;
  6759. }
  6760.  
  6761. /*==============================================================================
  6762.  *    MF3D_ObjAmbientLightReader
  6763.  *==============================================================================
  6764.  */
  6765. MF3DErr
  6766. MF3D_ObjAmbientLightReader(
  6767.     MF3D_FilePtr    inMetafilePtr,
  6768.     MF3DVoidObjPtr    *outObj)
  6769. {
  6770.     MF3DAmbientLightObjPtr        returnObj;
  6771.     MF3DErr                        result;
  6772.  
  6773.     MF3D_Unused(inMetafilePtr);
  6774.     result = kMF3DNoErr;
  6775.  
  6776.     MF3D_Allocate(returnObj);
  6777.  
  6778.     if (result == kMF3DNoErr)
  6779.         *outObj = (MF3DVoidObjPtr) returnObj;
  6780.     else
  6781.         MF3D_Free(returnObj);
  6782.  
  6783.     return result;
  6784. }
  6785.  
  6786. /*==============================================================================
  6787.  *    MF3D_ObjAmbientLightWriter
  6788.  *==============================================================================
  6789.  */
  6790. MF3DErr
  6791. MF3D_ObjAmbientLightWriter(
  6792.     MF3D_FilePtr    inMetafilePtr,
  6793.     MF3DVoidObjPtr    inObj)
  6794. {
  6795.     MF3D_VerifyObjectType(inObj, kMF3DObjAmbientLight);
  6796.     MF3D_Unused(inMetafilePtr);
  6797.     MF3D_Unused(inObj);
  6798.     /* Nothing to write! */
  6799.     return kMF3DNoErr;
  6800. }
  6801.  
  6802. /*==============================================================================
  6803.  *    MF3D_ObjAmbientLightDisposer
  6804.  *==============================================================================
  6805.  */
  6806. MF3DErr
  6807. MF3D_ObjAmbientLightDisposer(
  6808.     MF3DVoidObjPtr    inObj)
  6809. {
  6810.     MF3D_VerifyObjectType(inObj, kMF3DObjAmbientLight);
  6811.  
  6812.     MF3D_Free(inObj);
  6813.     return kMF3DNoErr;
  6814. }
  6815.  
  6816. /*==============================================================================
  6817.  *    MF3D_ObjDirectionalLightReader
  6818.  *==============================================================================
  6819.  */
  6820. MF3DErr
  6821. MF3D_ObjDirectionalLightReader(
  6822.     MF3D_FilePtr    inMetafilePtr,
  6823.     MF3DVoidObjPtr    *outObj)
  6824. {
  6825.     MF3DDirectionalLightObjPtr    returnObj;
  6826.     MF3DErr                        result;
  6827.  
  6828.     result = kMF3DNoErr;
  6829.  
  6830.     MF3D_Allocate(returnObj);
  6831.  
  6832.     if (result == kMF3DNoErr)
  6833.         result = MF3D_Vector3DRead(inMetafilePtr, &returnObj->direction);
  6834.  
  6835.     if (result == kMF3DNoErr)
  6836.         result = MF3D_BooleanRead(inMetafilePtr, &returnObj->castsShadows);
  6837.  
  6838.     if (result == kMF3DNoErr)
  6839.         *outObj = (MF3DVoidObjPtr) returnObj;
  6840.     else
  6841.         MF3D_Free(returnObj);
  6842.  
  6843.     return result;
  6844. }
  6845.  
  6846. /*==============================================================================
  6847.  *    MF3D_ObjDirectionalLightWriter
  6848.  *==============================================================================
  6849.  */
  6850. MF3DErr
  6851. MF3D_ObjDirectionalLightWriter(
  6852.     MF3D_FilePtr    inMetafilePtr,
  6853.     MF3DVoidObjPtr    inObj)
  6854. {
  6855.     MF3DDirectionalLightObjPtr    writeObj;
  6856.     MF3DErr                        result;
  6857.  
  6858.     MF3D_VerifyObjectType(inObj, kMF3DObjDirectionalLight);
  6859.     writeObj = (MF3DDirectionalLightObjPtr)inObj;
  6860.  
  6861.     result = MF3D_Vector3DWrite(inMetafilePtr, writeObj->direction);
  6862.  
  6863.     if (result == kMF3DNoErr)
  6864.         result = MF3D_BooleanWrite(inMetafilePtr, writeObj->castsShadows);
  6865.  
  6866.     return result;
  6867. }
  6868.  
  6869. /*==============================================================================
  6870.  *    MF3D_ObjDirectionalLightDisposer
  6871.  *==============================================================================
  6872.  */
  6873. MF3DErr
  6874. MF3D_ObjDirectionalLightDisposer(
  6875.     MF3DVoidObjPtr    inObj)
  6876. {
  6877.     MF3D_VerifyObjectType(inObj, kMF3DObjDirectionalLight);
  6878.  
  6879.     MF3D_Free(inObj);
  6880.     return kMF3DNoErr;
  6881. }
  6882.  
  6883. /*==============================================================================
  6884.  *    MF3D_ObjPointLightReader
  6885.  *==============================================================================
  6886.  */
  6887. MF3DErr
  6888. MF3D_ObjPointLightReader(
  6889.     MF3D_FilePtr    inMetafilePtr,
  6890.     MF3DVoidObjPtr    *outObj)
  6891. {
  6892.     MF3DPointLightObjPtr        returnObj;
  6893.     MF3DErr                        result;
  6894.  
  6895.     result = kMF3DNoErr;
  6896.  
  6897.     MF3D_Allocate(returnObj);
  6898.  
  6899.     if (result == kMF3DNoErr)
  6900.         result = MF3D_Point3DRead(inMetafilePtr, &returnObj->location);
  6901.  
  6902.     if (result == kMF3DNoErr)
  6903.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->attenuation.c0);
  6904.  
  6905.     if (result == kMF3DNoErr)
  6906.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->attenuation.c1);
  6907.  
  6908.     if (result == kMF3DNoErr)
  6909.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->attenuation.c2);
  6910.  
  6911.     if (result == kMF3DNoErr)
  6912.         result = MF3D_BooleanRead(inMetafilePtr, &returnObj->castsShadows);
  6913.  
  6914.     if (result == kMF3DNoErr)
  6915.         *outObj = (MF3DVoidObjPtr) returnObj;
  6916.     else
  6917.         MF3D_Free(returnObj);
  6918.  
  6919.     return result;
  6920. }
  6921.  
  6922. /*==============================================================================
  6923.  *    MF3D_ObjPointLightWriter
  6924.  *==============================================================================
  6925.  */
  6926. MF3DErr
  6927. MF3D_ObjPointLightWriter(
  6928.     MF3D_FilePtr    inMetafilePtr,
  6929.     MF3DVoidObjPtr    inObj)
  6930. {
  6931.     MF3DPointLightObjPtr        writeObj;
  6932.     MF3DErr                        result;
  6933.  
  6934.     MF3D_VerifyObjectType(inObj, kMF3DObjPointLight);
  6935.     writeObj = (MF3DPointLightObjPtr)inObj;
  6936.  
  6937.     result = kMF3DNoErr;
  6938.  
  6939.     result = MF3D_Point3DWrite(inMetafilePtr, writeObj->location);
  6940.  
  6941.     if (result == kMF3DNoErr)
  6942.         result = MF3D_Float32Write(inMetafilePtr, writeObj->attenuation.c0);
  6943.  
  6944.     if (result == kMF3DNoErr)
  6945.         result = MF3D_Float32Write(inMetafilePtr, writeObj->attenuation.c1);
  6946.  
  6947.     if (result == kMF3DNoErr)
  6948.         result = MF3D_Float32Write(inMetafilePtr, writeObj->attenuation.c2);
  6949.  
  6950.     if (result == kMF3DNoErr)
  6951.         result = MF3D_BooleanWrite(inMetafilePtr, writeObj->castsShadows);
  6952.  
  6953.     return result;
  6954. }
  6955.  
  6956. /*==============================================================================
  6957.  *    MF3D_ObjPointLightDisposer
  6958.  *==============================================================================
  6959.  */
  6960. MF3DErr
  6961. MF3D_ObjPointLightDisposer(
  6962.     MF3DVoidObjPtr    inObj)
  6963. {
  6964.     MF3D_VerifyObjectType(inObj, kMF3DObjPointLight);
  6965.  
  6966.     MF3D_Free(inObj);
  6967.     return kMF3DNoErr;
  6968. }
  6969.  
  6970. /*==============================================================================
  6971.  *    MF3D_ObjSpotLightReader
  6972.  *==============================================================================
  6973.  */
  6974. MF3DErr
  6975. MF3D_ObjSpotLightReader(
  6976.     MF3D_FilePtr    inMetafilePtr,
  6977.     MF3DVoidObjPtr    *outObj)
  6978. {
  6979.     MF3DSpotLightObjPtr            returnObj;
  6980.     MF3DErr                        result;
  6981.  
  6982.     result = kMF3DNoErr;
  6983.  
  6984.     MF3D_Allocate(returnObj);
  6985.  
  6986.     if (result == kMF3DNoErr)
  6987.         result = MF3D_Point3DRead(inMetafilePtr, &returnObj->location);
  6988.  
  6989.     if (result == kMF3DNoErr)
  6990.         result = MF3D_Vector3DRead(inMetafilePtr, &returnObj->orientation);
  6991.  
  6992.     if (result == kMF3DNoErr)
  6993.         result = MF3D_BooleanRead(inMetafilePtr, &returnObj->castsShadows);
  6994.  
  6995.     if (result == kMF3DNoErr)
  6996.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->attenuation.c0);
  6997.  
  6998.     if (result == kMF3DNoErr)
  6999.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->attenuation.c1);
  7000.  
  7001.     if (result == kMF3DNoErr)
  7002.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->attenuation.c2);
  7003.  
  7004.     if (result == kMF3DNoErr)
  7005.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->hotAngle);
  7006.  
  7007.     if (result == kMF3DNoErr)
  7008.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->outerAngle);
  7009.  
  7010.     if (result == kMF3DNoErr)
  7011.     {    result = MF3D_EnumRead(inMetafilePtr, gMF3D_FallOffEnum,
  7012.                 &returnObj->fallOff);
  7013.     }
  7014.  
  7015.     if (result == kMF3DNoErr)
  7016.         *outObj = (MF3DVoidObjPtr) returnObj;
  7017.     else
  7018.         MF3D_Free(returnObj);
  7019.  
  7020.     return result;
  7021. }
  7022.  
  7023. /*==============================================================================
  7024.  *    MF3D_ObjSpotLightWriter
  7025.  *==============================================================================
  7026.  */
  7027. MF3DErr
  7028. MF3D_ObjSpotLightWriter(
  7029.     MF3D_FilePtr    inMetafilePtr,
  7030.     MF3DVoidObjPtr    inObj)
  7031. {
  7032.     MF3DSpotLightObjPtr            writeObj;
  7033.     MF3DErr                        result;
  7034.  
  7035.     MF3D_VerifyObjectType(inObj, kMF3DObjSpotLight);
  7036.     writeObj = (MF3DSpotLightObjPtr)inObj;
  7037.  
  7038.     result = MF3D_Point3DWrite(inMetafilePtr, writeObj->location);
  7039.  
  7040.     if (result == kMF3DNoErr)
  7041.         result = MF3D_Vector3DWrite(inMetafilePtr, writeObj->orientation);
  7042.  
  7043.     if (result == kMF3DNoErr)
  7044.         result = MF3D_BooleanWrite(inMetafilePtr, writeObj->castsShadows);
  7045.  
  7046.     if (result == kMF3DNoErr)
  7047.         result = MF3D_Float32Write(inMetafilePtr, writeObj->attenuation.c0);
  7048.  
  7049.     if (result == kMF3DNoErr)
  7050.         result = MF3D_Float32Write(inMetafilePtr, writeObj->attenuation.c1);
  7051.  
  7052.     if (result == kMF3DNoErr)
  7053.         result = MF3D_Float32Write(inMetafilePtr, writeObj->attenuation.c2);
  7054.  
  7055.     if (result == kMF3DNoErr)
  7056.         result = MF3D_Float32Write(inMetafilePtr, writeObj->hotAngle);
  7057.  
  7058.     if (result == kMF3DNoErr)
  7059.         result = MF3D_Float32Write(inMetafilePtr, writeObj->outerAngle);
  7060.  
  7061.     if (result == kMF3DNoErr)
  7062.     {    result = MF3D_EnumWrite(inMetafilePtr, gMF3D_FallOffEnum,
  7063.                 writeObj->fallOff);
  7064.     }
  7065.  
  7066.     return result;
  7067. }
  7068.  
  7069. /*==============================================================================
  7070.  *    MF3D_ObjSpotLightDisposer
  7071.  *==============================================================================
  7072.  */
  7073. MF3DErr
  7074. MF3D_ObjSpotLightDisposer(
  7075.     MF3DVoidObjPtr    inObj)
  7076. {
  7077.     MF3D_VerifyObjectType(inObj, kMF3DObjSpotLight);
  7078.  
  7079.     MF3D_Free(inObj);
  7080.     return kMF3DNoErr;
  7081. }
  7082.  
  7083. /*==============================================================================
  7084.  *    MF3D_ObjLambertIlluminationReader
  7085.  *==============================================================================
  7086.  */
  7087. MF3DErr
  7088. MF3D_ObjLambertIlluminationReader(
  7089.     MF3D_FilePtr    inMetafilePtr,
  7090.     MF3DVoidObjPtr    *outObj)
  7091. {
  7092.     MF3DLambertIlluminationObjPtr    returnObj;
  7093.     MF3DErr                        result;
  7094.  
  7095.     MF3D_Unused(inMetafilePtr);
  7096.     result = kMF3DNoErr;
  7097.  
  7098.     MF3D_Allocate(returnObj);
  7099.  
  7100.     if (result == kMF3DNoErr)
  7101.         *outObj = (MF3DVoidObjPtr) returnObj;
  7102.     else
  7103.         MF3D_Free(returnObj);
  7104.  
  7105.     return result;
  7106. }
  7107.  
  7108. /*==============================================================================
  7109.  *    MF3D_ObjLambertIlluminationWriter
  7110.  *==============================================================================
  7111.  */
  7112. MF3DErr
  7113. MF3D_ObjLambertIlluminationWriter(
  7114.     MF3D_FilePtr    inMetafilePtr,
  7115.     MF3DVoidObjPtr    inObj)
  7116. {
  7117.     MF3D_VerifyObjectType(inObj, kMF3DObjLambertIllumination);
  7118.     MF3D_Unused(inMetafilePtr);
  7119.     MF3D_Unused(inObj);
  7120.     /* Nothing to write! */
  7121.     return kMF3DNoErr;
  7122. }
  7123.  
  7124. /*==============================================================================
  7125.  *    MF3D_ObjLambertIlluminationDisposer
  7126.  *==============================================================================
  7127.  */
  7128. MF3DErr
  7129. MF3D_ObjLambertIlluminationDisposer(
  7130.     MF3DVoidObjPtr    inObj)
  7131. {
  7132.     MF3D_VerifyObjectType(inObj, kMF3DObjLambertIllumination);
  7133.  
  7134.     MF3D_Free(inObj);
  7135.     return kMF3DNoErr;
  7136. }
  7137.  
  7138. /*==============================================================================
  7139.  *    MF3D_ObjPhongIlluminationReader
  7140.  *==============================================================================
  7141.  */
  7142. MF3DErr
  7143. MF3D_ObjPhongIlluminationReader(
  7144.     MF3D_FilePtr    inMetafilePtr,
  7145.     MF3DVoidObjPtr    *outObj)
  7146. {
  7147.     MF3DPhongIlluminationObjPtr    returnObj;
  7148.     MF3DErr                        result;
  7149.  
  7150.     MF3D_Unused(inMetafilePtr);
  7151.     result = kMF3DNoErr;
  7152.  
  7153.     MF3D_Allocate(returnObj);
  7154.  
  7155.     if (result == kMF3DNoErr)
  7156.         *outObj = (MF3DVoidObjPtr) returnObj;
  7157.     else
  7158.         MF3D_Free(returnObj);
  7159.  
  7160.     return result;
  7161. }
  7162.  
  7163. /*==============================================================================
  7164.  *    MF3D_ObjPhongIlluminationWriter
  7165.  *==============================================================================
  7166.  */
  7167. MF3DErr
  7168. MF3D_ObjPhongIlluminationWriter(
  7169.     MF3D_FilePtr    inMetafilePtr,
  7170.     MF3DVoidObjPtr    inObj)
  7171. {
  7172.     MF3D_VerifyObjectType(inObj, kMF3DObjPhongIllumination);
  7173.     MF3D_Unused(inMetafilePtr);
  7174.     MF3D_Unused(inObj);
  7175.     /* Nothing to write! */
  7176.     return kMF3DNoErr;
  7177. }
  7178.  
  7179. /*==============================================================================
  7180.  *    MF3D_ObjPhongIlluminationDisposer
  7181.  *==============================================================================
  7182.  */
  7183. MF3DErr
  7184. MF3D_ObjPhongIlluminationDisposer(
  7185.     MF3DVoidObjPtr    inObj)
  7186. {
  7187.     MF3D_VerifyObjectType(inObj, kMF3DObjPhongIllumination);
  7188.  
  7189.     MF3D_Free(inObj);
  7190.     return kMF3DNoErr;
  7191. }
  7192.  
  7193. /*==============================================================================
  7194.  *    MF3D_ObjTextureShaderReader
  7195.  *==============================================================================
  7196.  */
  7197. MF3DErr
  7198. MF3D_ObjTextureShaderReader(
  7199.     MF3D_FilePtr    inMetafilePtr,
  7200.     MF3DVoidObjPtr    *outObj)
  7201. {
  7202.     MF3DTextureShaderObjPtr        returnObj;
  7203.     MF3DErr                        result;
  7204.  
  7205.     MF3D_Unused(inMetafilePtr);
  7206.     result = kMF3DNoErr;
  7207.  
  7208.     MF3D_Allocate(returnObj);
  7209.  
  7210.     if (result == kMF3DNoErr)
  7211.         *outObj = (MF3DVoidObjPtr) returnObj;
  7212.     else
  7213.         MF3D_Free(returnObj);
  7214.  
  7215.     return result;
  7216. }
  7217.  
  7218. /*==============================================================================
  7219.  *    MF3D_ObjTextureShaderWriter
  7220.  *==============================================================================
  7221.  */
  7222. MF3DErr
  7223. MF3D_ObjTextureShaderWriter(
  7224.     MF3D_FilePtr    inMetafilePtr,
  7225.     MF3DVoidObjPtr    inObj)
  7226. {
  7227.     MF3D_VerifyObjectType(inObj, kMF3DObjTextureShader);
  7228.     MF3D_Unused(inMetafilePtr);
  7229.     MF3D_Unused(inObj);
  7230.     /* Nothing to write! */
  7231.     return kMF3DNoErr;
  7232. }
  7233.  
  7234. /*==============================================================================
  7235.  *    MF3D_ObjTextureShaderDisposer
  7236.  *==============================================================================
  7237.  */
  7238. MF3DErr
  7239. MF3D_ObjTextureShaderDisposer(
  7240.     MF3DVoidObjPtr    inObj)
  7241. {
  7242.     MF3D_VerifyObjectType(inObj, kMF3DObjTextureShader);
  7243.  
  7244.     MF3D_Free(inObj);
  7245.     return kMF3DNoErr;
  7246. }
  7247.  
  7248. #if defined(__COMPILING_ON_MACINTOSH__)
  7249. #pragma segment __OBJECTS_4__
  7250. #endif
  7251.  
  7252. /*==============================================================================
  7253.  *    MF3D_ObjBackfacingStyleReader
  7254.  *==============================================================================
  7255.  */
  7256. MF3DErr
  7257. MF3D_ObjBackfacingStyleReader(
  7258.     MF3D_FilePtr    inMetafilePtr,
  7259.     MF3DVoidObjPtr    *outObj)
  7260. {
  7261.     MF3DBackfacingStyleObjPtr    returnObj;
  7262.     MF3DErr                        result;
  7263.  
  7264.     result = kMF3DNoErr;
  7265.  
  7266.     MF3D_Allocate(returnObj);
  7267.  
  7268.     if (result == kMF3DNoErr)
  7269.     {    result = MF3D_EnumRead(inMetafilePtr, gMF3D_BackfacingEnum,
  7270.                 &returnObj->backfacing);
  7271.     }
  7272.  
  7273.     if (result == kMF3DNoErr)
  7274.         *outObj = (MF3DVoidObjPtr) returnObj;
  7275.     else
  7276.         MF3D_Free(returnObj);
  7277.  
  7278.     return result;
  7279. }
  7280.  
  7281. /*==============================================================================
  7282.  *    MF3D_ObjBackfacingStyleWriter
  7283.  *==============================================================================
  7284.  */
  7285. MF3DErr
  7286. MF3D_ObjBackfacingStyleWriter(
  7287.     MF3D_FilePtr    inMetafilePtr,
  7288.     MF3DVoidObjPtr    inObj)
  7289. {
  7290.     MF3D_VerifyObjectType(inObj, kMF3DObjBackfacingStyle);
  7291.     return MF3D_EnumWrite(inMetafilePtr, gMF3D_BackfacingEnum,
  7292.             ((MF3DBackfacingStyleObjPtr)inObj)->backfacing);
  7293. }
  7294.  
  7295. /*==============================================================================
  7296.  *    MF3D_ObjBackfacingStyleDisposer
  7297.  *==============================================================================
  7298.  */
  7299. MF3DErr
  7300. MF3D_ObjBackfacingStyleDisposer(
  7301.     MF3DVoidObjPtr    inObj)
  7302. {
  7303.     MF3D_VerifyObjectType(inObj, kMF3DObjBackfacingStyle);
  7304.  
  7305.     MF3D_Free(inObj);
  7306.     return kMF3DNoErr;
  7307. }
  7308.  
  7309. /*==============================================================================
  7310.  *    MF3D_ObjFillStyleReader
  7311.  *==============================================================================
  7312.  */
  7313. MF3DErr
  7314. MF3D_ObjFillStyleReader(
  7315.     MF3D_FilePtr    inMetafilePtr,
  7316.     MF3DVoidObjPtr    *outObj)
  7317. {
  7318.     MF3DFillStyleObjPtr            returnObj;
  7319.     MF3DErr                        result;
  7320.  
  7321.     result = kMF3DNoErr;
  7322.  
  7323.     MF3D_Allocate(returnObj);
  7324.  
  7325.     if (result == kMF3DNoErr)
  7326.     {    result = MF3D_EnumRead(inMetafilePtr, gMF3D_FillStyleEnum,
  7327.                 &returnObj->fillStyle);
  7328.     }
  7329.  
  7330.     if (result == kMF3DNoErr)
  7331.         *outObj = (MF3DVoidObjPtr) returnObj;
  7332.     else
  7333.         MF3D_Free(returnObj);
  7334.  
  7335.     return result;
  7336. }
  7337.  
  7338. /*==============================================================================
  7339.  *    MF3D_ObjFillStyleWriter
  7340.  *==============================================================================
  7341.  */
  7342. MF3DErr
  7343. MF3D_ObjFillStyleWriter(
  7344.     MF3D_FilePtr    inMetafilePtr,
  7345.     MF3DVoidObjPtr    inObj)
  7346. {
  7347.     MF3D_VerifyObjectType(inObj, kMF3DObjFillStyle);
  7348.     return MF3D_EnumWrite(inMetafilePtr, gMF3D_FillStyleEnum,
  7349.             ((MF3DFillStyleObjPtr)inObj)->fillStyle);
  7350. }
  7351.  
  7352. /*==============================================================================
  7353.  *    MF3D_ObjFillStyleDisposer
  7354.  *==============================================================================
  7355.  */
  7356. MF3DErr
  7357. MF3D_ObjFillStyleDisposer(
  7358.     MF3DVoidObjPtr    inObj)
  7359. {
  7360.     MF3D_VerifyObjectType(inObj, kMF3DObjFillStyle);
  7361.  
  7362.     MF3D_Free(inObj);
  7363.     return kMF3DNoErr;
  7364. }
  7365.  
  7366. /*==============================================================================
  7367.  *    MF3D_ObjHighlightStyleReader
  7368.  *==============================================================================
  7369.  */
  7370. MF3DErr
  7371. MF3D_ObjHighlightStyleReader(
  7372.     MF3D_FilePtr    inMetafilePtr,
  7373.     MF3DVoidObjPtr    *outObj)
  7374. {
  7375.     MF3DHighlightStyleObjPtr    returnObj;
  7376.     MF3DErr                        result;
  7377.  
  7378.     MF3D_Unused(inMetafilePtr);
  7379.     result = kMF3DNoErr;
  7380.  
  7381.     MF3D_Allocate(returnObj);
  7382.  
  7383.     if (result == kMF3DNoErr)
  7384.         *outObj = (MF3DVoidObjPtr) returnObj;
  7385.     else
  7386.         MF3D_Free(returnObj);
  7387.  
  7388.     return result;
  7389. }
  7390.  
  7391. /*==============================================================================
  7392.  *    MF3D_ObjHighlightStyleWriter
  7393.  *==============================================================================
  7394.  */
  7395. MF3DErr
  7396. MF3D_ObjHighlightStyleWriter(
  7397.     MF3D_FilePtr    inMetafilePtr,
  7398.     MF3DVoidObjPtr    inObj)
  7399. {
  7400.     MF3D_VerifyObjectType(inObj, kMF3DObjHighlightStyle);
  7401.     MF3D_Unused(inMetafilePtr);
  7402.     MF3D_Unused(inObj);
  7403.     /* Nothing to write! */
  7404.     return kMF3DNoErr;
  7405. }
  7406.  
  7407. /*==============================================================================
  7408.  *    MF3D_ObjHighlightStyleDisposer
  7409.  *==============================================================================
  7410.  */
  7411. MF3DErr
  7412. MF3D_ObjHighlightStyleDisposer(
  7413.     MF3DVoidObjPtr    inObj)
  7414. {
  7415.     MF3D_VerifyObjectType(inObj, kMF3DObjHighlightStyle);
  7416.  
  7417.     MF3D_Free(inObj);
  7418.     return kMF3DNoErr;
  7419. }
  7420.  
  7421. /*==============================================================================
  7422.  *    MF3D_ObjInterpolationStyleReader
  7423.  *==============================================================================
  7424.  */
  7425. MF3DErr
  7426. MF3D_ObjInterpolationStyleReader(
  7427.     MF3D_FilePtr    inMetafilePtr,
  7428.     MF3DVoidObjPtr    *outObj)
  7429. {
  7430.     MF3DInterpolationStyleObjPtr    returnObj;
  7431.     MF3DErr                            result;
  7432.  
  7433.     result = kMF3DNoErr;
  7434.  
  7435.     MF3D_Allocate(returnObj);
  7436.  
  7437.     if (result == kMF3DNoErr)
  7438.     {    result = MF3D_EnumRead(inMetafilePtr, gMF3D_InterpolationStyleEnum,
  7439.                 &returnObj->interpolationStyle);
  7440.     }
  7441.  
  7442.     if (result == kMF3DNoErr)
  7443.         *outObj = (MF3DVoidObjPtr) returnObj;
  7444.     else
  7445.         MF3D_Free(returnObj);
  7446.  
  7447.     return result;
  7448. }
  7449.  
  7450. /*==============================================================================
  7451.  *    MF3D_ObjInterpolationStyleWriter
  7452.  *==============================================================================
  7453.  */
  7454. MF3DErr
  7455. MF3D_ObjInterpolationStyleWriter(
  7456.     MF3D_FilePtr    inMetafilePtr,
  7457.     MF3DVoidObjPtr    inObj)
  7458. {
  7459.     MF3D_VerifyObjectType(inObj, kMF3DObjInterpolationStyle);
  7460.     return MF3D_EnumWrite(inMetafilePtr, gMF3D_InterpolationStyleEnum,
  7461.                 ((MF3DInterpolationStyleObjPtr)inObj)->interpolationStyle);
  7462. }
  7463.  
  7464. /*==============================================================================
  7465.  *    MF3D_ObjInterpolationStyleDisposer
  7466.  *==============================================================================
  7467.  */
  7468. MF3DErr
  7469. MF3D_ObjInterpolationStyleDisposer(
  7470.     MF3DVoidObjPtr    inObj)
  7471. {
  7472.     MF3D_VerifyObjectType(inObj, kMF3DObjInterpolationStyle);
  7473.  
  7474.     MF3D_Free(inObj);
  7475.     return kMF3DNoErr;
  7476. }
  7477.  
  7478. /*==============================================================================
  7479.  *    MF3D_ObjOrientationStyleReader
  7480.  *==============================================================================
  7481.  */
  7482. MF3DErr
  7483. MF3D_ObjOrientationStyleReader(
  7484.     MF3D_FilePtr    inMetafilePtr,
  7485.     MF3DVoidObjPtr    *outObj)
  7486. {
  7487.     MF3DOrientationStyleObjPtr    returnObj;
  7488.     MF3DErr                        result;
  7489.  
  7490.     result = kMF3DNoErr;
  7491.  
  7492.     MF3D_Allocate(returnObj);
  7493.  
  7494.     if (result == kMF3DNoErr)
  7495.     {    result = MF3D_EnumRead(inMetafilePtr, gMF3D_OrientationStyleEnum,
  7496.                 &returnObj->orientationStyle);
  7497.     }
  7498.  
  7499.     if (result == kMF3DNoErr)
  7500.         *outObj = (MF3DVoidObjPtr) returnObj;
  7501.     else
  7502.         MF3D_Free(returnObj);
  7503.  
  7504.     return result;
  7505. }
  7506.  
  7507. /*==============================================================================
  7508.  *    MF3D_ObjOrientationStyleWriter
  7509.  *==============================================================================
  7510.  */
  7511. MF3DErr
  7512. MF3D_ObjOrientationStyleWriter(
  7513.     MF3D_FilePtr    inMetafilePtr,
  7514.     MF3DVoidObjPtr    inObj)
  7515. {
  7516.     MF3D_VerifyObjectType(inObj, kMF3DObjOrientationStyle);
  7517.     return MF3D_EnumWrite(inMetafilePtr, gMF3D_OrientationStyleEnum,
  7518.                 ((MF3DOrientationStyleObjPtr)inObj)->orientationStyle);
  7519. }
  7520.  
  7521. /*==============================================================================
  7522.  *    MF3D_ObjOrientationStyleDisposer
  7523.  *==============================================================================
  7524.  */
  7525. MF3DErr
  7526. MF3D_ObjOrientationStyleDisposer(
  7527.     MF3DVoidObjPtr    inObj)
  7528. {
  7529.     MF3D_VerifyObjectType(inObj, kMF3DObjOrientationStyle);
  7530.  
  7531.     MF3D_Free(inObj);
  7532.     return kMF3DNoErr;
  7533. }
  7534.  
  7535. /*==============================================================================
  7536.  *    MF3D_ObjPickIDStyleReader
  7537.  *==============================================================================
  7538.  */
  7539. MF3DErr
  7540. MF3D_ObjPickIDStyleReader(
  7541.     MF3D_FilePtr    inMetafilePtr,
  7542.     MF3DVoidObjPtr    *outObj)
  7543. {
  7544.     MF3DPickIDStyleObjPtr        returnObj;
  7545.     MF3DErr                        result;
  7546.  
  7547.     result = kMF3DNoErr;
  7548.  
  7549.     MF3D_Allocate(returnObj);
  7550.  
  7551.     if (result == kMF3DNoErr)
  7552.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->id);
  7553.  
  7554.     if (result == kMF3DNoErr)
  7555.         *outObj = (MF3DVoidObjPtr) returnObj;
  7556.     else
  7557.         MF3D_Free(returnObj);
  7558.  
  7559.     return result;
  7560. }
  7561.  
  7562. /*==============================================================================
  7563.  *    MF3D_ObjPickIDStyleWriter
  7564.  *==============================================================================
  7565.  */
  7566. MF3DErr
  7567. MF3D_ObjPickIDStyleWriter(
  7568.     MF3D_FilePtr    inMetafilePtr,
  7569.     MF3DVoidObjPtr    inObj)
  7570. {
  7571.     MF3D_VerifyObjectType(inObj, kMF3DObjPickIDStyle);
  7572.     return MF3D_Uns32Write(inMetafilePtr, ((MF3DPickIDStyleObjPtr)inObj)->id);
  7573. }
  7574.  
  7575. /*==============================================================================
  7576.  *    MF3D_ObjPickIDStyleDisposer
  7577.  *==============================================================================
  7578.  */
  7579. MF3DErr
  7580. MF3D_ObjPickIDStyleDisposer(
  7581.     MF3DVoidObjPtr    inObj)
  7582. {
  7583.     MF3D_VerifyObjectType(inObj, kMF3DObjPickIDStyle);
  7584.  
  7585.     MF3D_Free(inObj);
  7586.     return kMF3DNoErr;
  7587. }
  7588.  
  7589. /*==============================================================================
  7590.  *    MF3D_ObjPickPartsStyleReader
  7591.  *==============================================================================
  7592.  */
  7593. MF3DErr
  7594. MF3D_ObjPickPartsStyleReader(
  7595.     MF3D_FilePtr    inMetafilePtr,
  7596.     MF3DVoidObjPtr    *outObj)
  7597. {
  7598.     MF3DPickPartsStyleObjPtr    returnObj;
  7599.     MF3DErr                        result;
  7600.  
  7601.     result = kMF3DNoErr;
  7602.  
  7603.     MF3D_Allocate(returnObj);
  7604.  
  7605.     if (result == kMF3DNoErr)
  7606.     {    result = MF3D_FlagsRead(inMetafilePtr, gMF3D_PickPartsFlags,
  7607.                 &returnObj->pickParts);
  7608.     }
  7609.  
  7610.     if (result == kMF3DNoErr)
  7611.         *outObj = (MF3DVoidObjPtr) returnObj;
  7612.     else
  7613.         MF3D_Free(returnObj);
  7614.  
  7615.     return result;
  7616. }
  7617.  
  7618. /*==============================================================================
  7619.  *    MF3D_ObjPickPartsStyleWriter
  7620.  *==============================================================================
  7621.  */
  7622. MF3DErr
  7623. MF3D_ObjPickPartsStyleWriter(
  7624.     MF3D_FilePtr    inMetafilePtr,
  7625.     MF3DVoidObjPtr    inObj)
  7626. {
  7627.     MF3D_VerifyObjectType(inObj, kMF3DObjPickPartsStyle);
  7628.     return MF3D_FlagsWrite(inMetafilePtr, gMF3D_PickPartsFlags,
  7629.             ((MF3DPickPartsStyleObjPtr)inObj)->pickParts);
  7630. }
  7631.  
  7632. /*==============================================================================
  7633.  *    MF3D_ObjPickPartsStyleDisposer
  7634.  *==============================================================================
  7635.  */
  7636. MF3DErr
  7637. MF3D_ObjPickPartsStyleDisposer(
  7638.     MF3DVoidObjPtr    inObj)
  7639. {
  7640.     MF3D_VerifyObjectType(inObj, kMF3DObjPickPartsStyle);
  7641.  
  7642.     MF3D_Free(inObj);
  7643.     return kMF3DNoErr;
  7644. }
  7645.  
  7646. /*==============================================================================
  7647.  *    MF3D_ObjReceiveShadowsStyleReader
  7648.  *==============================================================================
  7649.  */
  7650. MF3DErr
  7651. MF3D_ObjReceiveShadowsStyleReader(
  7652.     MF3D_FilePtr    inMetafilePtr,
  7653.     MF3DVoidObjPtr    *outObj)
  7654. {
  7655.     MF3DReceiveShadowsStyleObjPtr    returnObj;
  7656.     MF3DErr                        result;
  7657.  
  7658.     result = kMF3DNoErr;
  7659.  
  7660.     MF3D_Allocate(returnObj);
  7661.  
  7662.     if (result == kMF3DNoErr)
  7663.         result = MF3D_BooleanRead(inMetafilePtr, &returnObj->receiveShadows);
  7664.  
  7665.     if (result == kMF3DNoErr)
  7666.         *outObj = (MF3DVoidObjPtr) returnObj;
  7667.     else
  7668.         MF3D_Free(returnObj);
  7669.  
  7670.     return result;
  7671. }
  7672.  
  7673. /*==============================================================================
  7674.  *    MF3D_ObjReceiveShadowsStyleWriter
  7675.  *==============================================================================
  7676.  */
  7677. MF3DErr
  7678. MF3D_ObjReceiveShadowsStyleWriter(
  7679.     MF3D_FilePtr    inMetafilePtr,
  7680.     MF3DVoidObjPtr    inObj)
  7681. {
  7682.     MF3D_VerifyObjectType(inObj, kMF3DObjReceiveShadowsStyle);
  7683.     return MF3D_BooleanWrite(inMetafilePtr,
  7684.             ((MF3DReceiveShadowsStyleObjPtr)inObj)->receiveShadows);
  7685. }
  7686.  
  7687. /*==============================================================================
  7688.  *    MF3D_ObjReceiveShadowsStyleDisposer
  7689.  *==============================================================================
  7690.  */
  7691. MF3DErr
  7692. MF3D_ObjReceiveShadowsStyleDisposer(
  7693.     MF3DVoidObjPtr    inObj)
  7694. {
  7695.     MF3D_VerifyObjectType(inObj, kMF3DObjReceiveShadowsStyle);
  7696.  
  7697.     MF3D_Free(inObj);
  7698.     return kMF3DNoErr;
  7699. }
  7700.  
  7701. /*==============================================================================
  7702.  *    MF3D_ObjSubdivisionStyleReader
  7703.  *==============================================================================
  7704.  */
  7705. MF3DErr
  7706. MF3D_ObjSubdivisionStyleReader(
  7707.     MF3D_FilePtr    inMetafilePtr,
  7708.     MF3DVoidObjPtr    *outObj)
  7709. {
  7710.     MF3DSubdivisionStyleObjPtr    returnObj;
  7711.     MF3DErr                        result;
  7712.  
  7713.     result = kMF3DNoErr;
  7714.  
  7715.     MF3D_Allocate(returnObj);
  7716.  
  7717.     if (result == kMF3DNoErr)
  7718.     {    result = MF3D_EnumRead(inMetafilePtr, gMF3D_SubdivisionMethodEnum,
  7719.                 &returnObj->subdivisionMethod);
  7720.     }
  7721.  
  7722.     if (result == kMF3DNoErr)
  7723.     {    if (returnObj->subdivisionMethod == MF3DSubdivisionConstant)
  7724.         {    result = MF3D_Uns32Read(inMetafilePtr,
  7725.                     &returnObj->subdivisionData.constant.value1);
  7726.             if (result == kMF3DNoErr)
  7727.             {    result = MF3D_Uns32Read(inMetafilePtr,
  7728.                         &returnObj->subdivisionData.constant.value2);
  7729.             }
  7730.         }
  7731.         else
  7732.         {    MFASSERT(returnObj->subdivisionMethod ==
  7733.                     MF3DSubdivisionWorldSpace ||
  7734.                     returnObj->subdivisionMethod ==
  7735.                     MF3DSubdivisionScreenSpace);
  7736.  
  7737.             result = MF3D_Float32Read(inMetafilePtr,
  7738.                     &returnObj->subdivisionData.space.value1);
  7739.         }
  7740.     }
  7741.  
  7742.     if (result == kMF3DNoErr)
  7743.         *outObj = (MF3DVoidObjPtr) returnObj;
  7744.     else
  7745.         MF3D_Free(returnObj);
  7746.  
  7747.     return result;
  7748. }
  7749.  
  7750. /*==============================================================================
  7751.  *    MF3D_ObjSubdivisionStyleWriter
  7752.  *==============================================================================
  7753.  */
  7754. MF3DErr
  7755. MF3D_ObjSubdivisionStyleWriter(
  7756.     MF3D_FilePtr    inMetafilePtr,
  7757.     MF3DVoidObjPtr    inObj)
  7758. {
  7759.     MF3DSubdivisionStyleObjPtr    writeObj;
  7760.     MF3DErr                        result;
  7761.  
  7762.     MF3D_VerifyObjectType(inObj, kMF3DObjSubdivisionStyle);
  7763.     writeObj = (MF3DSubdivisionStyleObjPtr)inObj;
  7764.  
  7765.     result = MF3D_EnumWrite(inMetafilePtr, gMF3D_SubdivisionMethodEnum,
  7766.             writeObj->subdivisionMethod);
  7767.  
  7768.     if (result == kMF3DNoErr)
  7769.     {    if (writeObj->subdivisionMethod == MF3DSubdivisionConstant)
  7770.         {    result = MF3D_Uns32Write(inMetafilePtr,
  7771.                     writeObj->subdivisionData.constant.value1);
  7772.             if (result == kMF3DNoErr)
  7773.             {    result = MF3D_Uns32Write(inMetafilePtr,
  7774.                         writeObj->subdivisionData.constant.value2);
  7775.             }
  7776.         }
  7777.         else
  7778.         {    MFASSERT(writeObj->subdivisionMethod ==
  7779.                     MF3DSubdivisionWorldSpace ||
  7780.                     writeObj->subdivisionMethod ==
  7781.                     MF3DSubdivisionScreenSpace);
  7782.  
  7783.             result = MF3D_Float32Write(inMetafilePtr,
  7784.                     writeObj->subdivisionData.space.value1);
  7785.         }
  7786.     }
  7787.  
  7788.     return result;
  7789. }
  7790.  
  7791. /*==============================================================================
  7792.  *    MF3D_ObjSubdivisionStyleDisposer
  7793.  *==============================================================================
  7794.  */
  7795. MF3DErr
  7796. MF3D_ObjSubdivisionStyleDisposer(
  7797.     MF3DVoidObjPtr    inObj)
  7798. {
  7799.     MF3D_VerifyObjectType(inObj, kMF3DObjSubdivisionStyle);
  7800.  
  7801.     MF3D_Free(inObj);
  7802.     return kMF3DNoErr;
  7803. }
  7804.  
  7805. /*==============================================================================
  7806.  *    MF3D_ObjMatrixTransformReader
  7807.  *==============================================================================
  7808.  */
  7809. MF3DErr
  7810. MF3D_ObjMatrixTransformReader(
  7811.     MF3D_FilePtr    inMetafilePtr,
  7812.     MF3DVoidObjPtr    *outObj)
  7813. {
  7814.     MF3DMatrixObjPtr        returnObj;
  7815.     MF3DErr                    result;
  7816.  
  7817.     result = kMF3DNoErr;
  7818.  
  7819.     MF3D_Allocate(returnObj);
  7820.  
  7821.     if (result == kMF3DNoErr)
  7822.         result = MF3D_Matrix4x4Read(inMetafilePtr, returnObj->matrix);
  7823.  
  7824.     if (result == kMF3DNoErr)
  7825.         *outObj = (MF3DVoidObjPtr) returnObj;
  7826.     else
  7827.         MF3D_Free(returnObj);
  7828.  
  7829.     return result;
  7830. }
  7831.  
  7832. /*==============================================================================
  7833.  *    MF3D_ObjMatrixTransformWriter
  7834.  *==============================================================================
  7835.  */
  7836. MF3DErr
  7837. MF3D_ObjMatrixTransformWriter(
  7838.     MF3D_FilePtr    inMetafilePtr,
  7839.     MF3DVoidObjPtr    inObj)
  7840. {
  7841.     MF3D_VerifyObjectType(inObj, kMF3DObjMatrixTransform);
  7842.     MF3D_WriteNewLine(inMetafilePtr);
  7843.     return MF3D_Matrix4x4Write(inMetafilePtr, 
  7844.             ((const MF3DMatrixObj *)inObj)->matrix);
  7845. }
  7846.  
  7847. /*==============================================================================
  7848.  *    MF3D_ObjMatrixTransformDisposer
  7849.  *==============================================================================
  7850.  */
  7851. MF3DErr
  7852. MF3D_ObjMatrixTransformDisposer(
  7853.     MF3DVoidObjPtr    inObj)
  7854. {
  7855.     MF3D_VerifyObjectType(inObj, kMF3DObjMatrixTransform);
  7856.  
  7857.     MF3D_Free(inObj);
  7858.     return kMF3DNoErr;
  7859. }
  7860.  
  7861. /*==============================================================================
  7862.  *    MF3D_ObjQuaternionTransformReader
  7863.  *==============================================================================
  7864.  */
  7865. MF3DErr
  7866. MF3D_ObjQuaternionTransformReader(
  7867.     MF3D_FilePtr    inMetafilePtr,
  7868.     MF3DVoidObjPtr    *outObj)
  7869. {
  7870.     MF3DQuaternionObjPtr        returnObj;
  7871.     MF3DErr                        result;
  7872.  
  7873.     result = kMF3DNoErr;
  7874.  
  7875.     MF3D_Allocate(returnObj);
  7876.  
  7877.     if (result == kMF3DNoErr)
  7878.         result = MF3D_QuaternionRead(inMetafilePtr, &returnObj->quaternion);
  7879.  
  7880.     if (result == kMF3DNoErr)
  7881.         *outObj = (MF3DVoidObjPtr) returnObj;
  7882.     else
  7883.         MF3D_Free(returnObj);
  7884.  
  7885.     return result;
  7886. }
  7887.  
  7888. /*==============================================================================
  7889.  *    MF3D_ObjQuaternionTransformWriter
  7890.  *==============================================================================
  7891.  */
  7892. MF3DErr
  7893. MF3D_ObjQuaternionTransformWriter(
  7894.     MF3D_FilePtr    inMetafilePtr,
  7895.     MF3DVoidObjPtr    inObj)
  7896. {
  7897.     MF3D_VerifyObjectType(inObj, kMF3DObjQuaternionTransform);
  7898.     return MF3D_QuaternionWrite(inMetafilePtr,
  7899.             ((MF3DQuaternionObjPtr)inObj)->quaternion);
  7900. }
  7901.  
  7902. /*==============================================================================
  7903.  *    MF3D_ObjQuaternionTransformDisposer
  7904.  *==============================================================================
  7905.  */
  7906. MF3DErr
  7907. MF3D_ObjQuaternionTransformDisposer(
  7908.     MF3DVoidObjPtr    inObj)
  7909. {
  7910.     MF3D_VerifyObjectType(inObj, kMF3DObjQuaternionTransform);
  7911.  
  7912.     MF3D_Free(inObj);
  7913.     return kMF3DNoErr;
  7914. }
  7915.  
  7916. /*==============================================================================
  7917.  *    MF3D_ObjRotateTransformReader
  7918.  *==============================================================================
  7919.  */
  7920. MF3DErr
  7921. MF3D_ObjRotateTransformReader(
  7922.     MF3D_FilePtr    inMetafilePtr,
  7923.     MF3DVoidObjPtr    *outObj)
  7924. {
  7925.     MF3DRotateObjPtr            returnObj;
  7926.     MF3DErr                        result;
  7927.  
  7928.     result = kMF3DNoErr;
  7929.  
  7930.     MF3D_Allocate(returnObj);
  7931.  
  7932.     if (result == kMF3DNoErr)
  7933.         result = MF3D_EnumRead(inMetafilePtr, gMF3D_AxisEnum, &returnObj->axis);
  7934.  
  7935.     if (result == kMF3DNoErr)
  7936.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->radians);
  7937.  
  7938.     if (result == kMF3DNoErr)
  7939.         *outObj = (MF3DVoidObjPtr) returnObj;
  7940.     else
  7941.         MF3D_Free(returnObj);
  7942.  
  7943.     return result;
  7944. }
  7945.  
  7946. /*==============================================================================
  7947.  *    MF3D_ObjRotateTransformWriter
  7948.  *==============================================================================
  7949.  */
  7950. MF3DErr
  7951. MF3D_ObjRotateTransformWriter(
  7952.     MF3D_FilePtr    inMetafilePtr,
  7953.     MF3DVoidObjPtr    inObj)
  7954. {
  7955.     MF3DRotateObjPtr            writeObj;
  7956.     MF3DErr                        result;
  7957.  
  7958.     MF3D_VerifyObjectType(inObj, kMF3DObjRotateTransform);
  7959.     writeObj = (MF3DRotateObjPtr)inObj;
  7960.  
  7961.     result = MF3D_EnumWrite(inMetafilePtr, gMF3D_AxisEnum, writeObj->axis);
  7962.  
  7963.     if (result == kMF3DNoErr)
  7964.         result = MF3D_Float32Write(inMetafilePtr, writeObj->radians);
  7965.  
  7966.     return result;
  7967. }
  7968.  
  7969. /*==============================================================================
  7970.  *    MF3D_ObjRotateTransformDisposer
  7971.  *==============================================================================
  7972.  */
  7973. MF3DErr
  7974. MF3D_ObjRotateTransformDisposer(
  7975.     MF3DVoidObjPtr    inObj)
  7976. {
  7977.     MF3D_VerifyObjectType(inObj, kMF3DObjRotateTransform);
  7978.  
  7979.     MF3D_Free(inObj);
  7980.     return kMF3DNoErr;
  7981. }
  7982.  
  7983. /*==============================================================================
  7984.  *    MF3D_ObjRotateAboutAxisTransformReader
  7985.  *==============================================================================
  7986.  */
  7987. MF3DErr
  7988. MF3D_ObjRotateAboutAxisTransformReader(
  7989.     MF3D_FilePtr    inMetafilePtr,
  7990.     MF3DVoidObjPtr    *outObj)
  7991. {
  7992.     MF3DRotateAboutAxisObjPtr    returnObj;
  7993.     MF3DErr                        result;
  7994.  
  7995.     result = kMF3DNoErr;
  7996.  
  7997.     MF3D_Allocate(returnObj);
  7998.  
  7999.     if (result == kMF3DNoErr)
  8000.         result = MF3D_Point3DRead(inMetafilePtr, &returnObj->origin);
  8001.  
  8002.     if (result == kMF3DNoErr)
  8003.         result = MF3D_Vector3DRead(inMetafilePtr, &returnObj->orientation);
  8004.  
  8005.     if (result == kMF3DNoErr)
  8006.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->radians);
  8007.  
  8008.     if (result == kMF3DNoErr)
  8009.         *outObj = (MF3DVoidObjPtr) returnObj;
  8010.     else
  8011.         MF3D_Free(returnObj);
  8012.  
  8013.     return result;
  8014. }
  8015.  
  8016. /*==============================================================================
  8017.  *    MF3D_ObjRotateAboutAxisTransformWriter
  8018.  *==============================================================================
  8019.  */
  8020. MF3DErr
  8021. MF3D_ObjRotateAboutAxisTransformWriter(
  8022.     MF3D_FilePtr    inMetafilePtr,
  8023.     MF3DVoidObjPtr    inObj)
  8024. {
  8025.     MF3DRotateAboutAxisObjPtr    writeObj;
  8026.     MF3DErr                        result;
  8027.  
  8028.     MF3D_VerifyObjectType(inObj, kMF3DObjRotateAboutAxisTransform);
  8029.     writeObj = (MF3DRotateAboutAxisObjPtr)inObj;
  8030.  
  8031.     result = MF3D_Point3DWrite(inMetafilePtr, writeObj->origin);
  8032.  
  8033.     if (result == kMF3DNoErr)
  8034.         result = MF3D_Vector3DWrite(inMetafilePtr, writeObj->orientation);
  8035.  
  8036.     if (result == kMF3DNoErr)
  8037.         result = MF3D_Float32Write(inMetafilePtr, writeObj->radians);
  8038.  
  8039.     return result;
  8040. }
  8041.  
  8042. /*==============================================================================
  8043.  *    MF3D_ObjRotateAboutAxisTransformDisposer
  8044.  *==============================================================================
  8045.  */
  8046. MF3DErr
  8047. MF3D_ObjRotateAboutAxisTransformDisposer(
  8048.     MF3DVoidObjPtr    inObj)
  8049. {
  8050.     MF3D_VerifyObjectType(inObj, kMF3DObjRotateAboutAxisTransform);
  8051.  
  8052.     MF3D_Free(inObj);
  8053.     return kMF3DNoErr;
  8054. }
  8055.  
  8056. /*==============================================================================
  8057.  *    MF3D_ObjRotateAboutPointTransformReader
  8058.  *==============================================================================
  8059.  */
  8060. MF3DErr
  8061. MF3D_ObjRotateAboutPointTransformReader(
  8062.     MF3D_FilePtr    inMetafilePtr,
  8063.     MF3DVoidObjPtr    *outObj)
  8064. {
  8065.     MF3DRotateAboutPointObjPtr    returnObj;
  8066.     MF3DErr                        result;
  8067.  
  8068.     result = kMF3DNoErr;
  8069.  
  8070.     MF3D_Allocate(returnObj);
  8071.  
  8072.     if (result == kMF3DNoErr)
  8073.         result = MF3D_EnumRead(inMetafilePtr, gMF3D_AxisEnum, &returnObj->axis);
  8074.  
  8075.     if (result == kMF3DNoErr)
  8076.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->radians);
  8077.  
  8078.     if (result == kMF3DNoErr)
  8079.         result = MF3D_Point3DRead(inMetafilePtr, &returnObj->origin);
  8080.  
  8081.     if (result == kMF3DNoErr)
  8082.         *outObj = (MF3DVoidObjPtr) returnObj;
  8083.     else
  8084.         MF3D_Free(returnObj);
  8085.  
  8086.     return result;
  8087. }
  8088.  
  8089. /*==============================================================================
  8090.  *    MF3D_ObjRotateAboutPointTransformWriter
  8091.  *==============================================================================
  8092.  */
  8093. MF3DErr
  8094. MF3D_ObjRotateAboutPointTransformWriter(
  8095.     MF3D_FilePtr    inMetafilePtr,
  8096.     MF3DVoidObjPtr    inObj)
  8097. {
  8098.     MF3DRotateAboutPointObjPtr    writeObj;
  8099.     MF3DErr                        result;
  8100.  
  8101.     MF3D_VerifyObjectType(inObj, kMF3DObjRotateAboutPointTransform);
  8102.     writeObj = (MF3DRotateAboutPointObjPtr)inObj;
  8103.  
  8104.     result = MF3D_EnumWrite(inMetafilePtr, gMF3D_AxisEnum, writeObj->axis);
  8105.  
  8106.     if (result == kMF3DNoErr)
  8107.         result = MF3D_Float32Write(inMetafilePtr, writeObj->radians);
  8108.  
  8109.     if (result == kMF3DNoErr)
  8110.         result = MF3D_Point3DWrite(inMetafilePtr, writeObj->origin);
  8111.  
  8112.     return result;
  8113. }
  8114.  
  8115. /*==============================================================================
  8116.  *    MF3D_ObjRotateAboutPointTransformDisposer
  8117.  *==============================================================================
  8118.  */
  8119. MF3DErr
  8120. MF3D_ObjRotateAboutPointTransformDisposer(
  8121.     MF3DVoidObjPtr    inObj)
  8122. {
  8123.     MF3D_VerifyObjectType(inObj, kMF3DObjRotateAboutPointTransform);
  8124.  
  8125.     MF3D_Free(inObj);
  8126.     return kMF3DNoErr;
  8127. }
  8128.  
  8129. /*==============================================================================
  8130.  *    MF3D_ObjScaleTransformReader
  8131.  *==============================================================================
  8132.  */
  8133. MF3DErr
  8134. MF3D_ObjScaleTransformReader(
  8135.     MF3D_FilePtr    inMetafilePtr,
  8136.     MF3DVoidObjPtr    *outObj)
  8137. {
  8138.     MF3DScaleObjPtr                returnObj;
  8139.     MF3DErr                        result;
  8140.  
  8141.     result = kMF3DNoErr;
  8142.  
  8143.     MF3D_Allocate(returnObj);
  8144.  
  8145.     if (result == kMF3DNoErr)
  8146.         result = MF3D_Vector3DRead(inMetafilePtr, &returnObj->scale);
  8147.  
  8148.     if (result == kMF3DNoErr)
  8149.         *outObj = (MF3DVoidObjPtr) returnObj;
  8150.     else
  8151.         MF3D_Free(returnObj);
  8152.  
  8153.     return result;
  8154. }
  8155.  
  8156. /*==============================================================================
  8157.  *    MF3D_ObjScaleTransformWriter
  8158.  *==============================================================================
  8159.  */
  8160. MF3DErr
  8161. MF3D_ObjScaleTransformWriter(
  8162.     MF3D_FilePtr    inMetafilePtr,
  8163.     MF3DVoidObjPtr    inObj)
  8164. {
  8165.     MF3D_VerifyObjectType(inObj, kMF3DObjScaleTransform);
  8166.     return MF3D_Vector3DWrite(inMetafilePtr,
  8167.             ((MF3DScaleObjPtr)inObj)->scale);
  8168. }
  8169.  
  8170. /*==============================================================================
  8171.  *    MF3D_ObjScaleTransformDisposer
  8172.  *==============================================================================
  8173.  */
  8174. MF3DErr
  8175. MF3D_ObjScaleTransformDisposer(
  8176.     MF3DVoidObjPtr    inObj)
  8177. {
  8178.     MF3D_VerifyObjectType(inObj, kMF3DObjScaleTransform);
  8179.  
  8180.     MF3D_Free(inObj);
  8181.     return kMF3DNoErr;
  8182. }
  8183.  
  8184. /*==============================================================================
  8185.  *    MF3D_ObjTranslateTransformReader
  8186.  *==============================================================================
  8187.  */
  8188. MF3DErr
  8189. MF3D_ObjTranslateTransformReader(
  8190.     MF3D_FilePtr    inMetafilePtr,
  8191.     MF3DVoidObjPtr    *outObj)
  8192. {
  8193.     MF3DTranslateObjPtr            returnObj;
  8194.     MF3DErr                        result;
  8195.  
  8196.     result = kMF3DNoErr;
  8197.  
  8198.     MF3D_Allocate(returnObj);
  8199.  
  8200.     if (result == kMF3DNoErr)
  8201.         result = MF3D_Vector3DRead(inMetafilePtr, &returnObj->translate);
  8202.  
  8203.     if (result == kMF3DNoErr)
  8204.         *outObj = (MF3DVoidObjPtr) returnObj;
  8205.     else
  8206.         MF3D_Free(returnObj);
  8207.  
  8208.     return result;
  8209. }
  8210.  
  8211. /*==============================================================================
  8212.  *    MF3D_ObjTranslateTransformWriter
  8213.  *==============================================================================
  8214.  */
  8215. MF3DErr
  8216. MF3D_ObjTranslateTransformWriter(
  8217.     MF3D_FilePtr    inMetafilePtr,
  8218.     MF3DVoidObjPtr    inObj)
  8219. {
  8220.     MF3D_VerifyObjectType(inObj, kMF3DObjTranslateTransform);
  8221.     return MF3D_Vector3DWrite(inMetafilePtr,
  8222.             ((MF3DTranslateObjPtr)inObj)->translate);
  8223. }
  8224.  
  8225. /*==============================================================================
  8226.  *    MF3D_ObjTranslateTransformDisposer
  8227.  *==============================================================================
  8228.  */
  8229. MF3DErr
  8230. MF3D_ObjTranslateTransformDisposer(
  8231.     MF3DVoidObjPtr    inObj)
  8232. {
  8233.     MF3D_VerifyObjectType(inObj, kMF3DObjTranslateTransform);
  8234.  
  8235.     MF3D_Free(inObj);
  8236.     return kMF3DNoErr;
  8237. }
  8238.  
  8239. /*==============================================================================
  8240.  *    MF3D_ObjMacintoshPathReader
  8241.  *==============================================================================
  8242.  */
  8243. MF3DErr
  8244. MF3D_ObjMacintoshPathReader(
  8245.     MF3D_FilePtr    inMetafilePtr,
  8246.     MF3DVoidObjPtr    *outObj)
  8247. {
  8248.     MF3DMacintoshPathObjPtr        returnObj;
  8249.     MF3DErr                        result;
  8250.  
  8251.     result = kMF3DNoErr;
  8252.  
  8253.     MF3D_Allocate(returnObj);
  8254.  
  8255.     if (result == kMF3DNoErr)
  8256.         result = MF3D_CStringRead(inMetafilePtr, &returnObj->pathName);
  8257.  
  8258.     if (result == kMF3DNoErr)
  8259.         *outObj = (MF3DVoidObjPtr) returnObj;
  8260.     else
  8261.         MF3D_Free(returnObj);
  8262.  
  8263.     return result;
  8264. }
  8265.  
  8266. /*==============================================================================
  8267.  *    MF3D_ObjMacintoshPathWriter
  8268.  *==============================================================================
  8269.  */
  8270. MF3DErr
  8271. MF3D_ObjMacintoshPathWriter(
  8272.     MF3D_FilePtr    inMetafilePtr,
  8273.     MF3DVoidObjPtr    inObj)
  8274. {
  8275.     MF3D_VerifyObjectType(inObj, kMF3DObjMacintoshPath);
  8276.     return MF3D_CStringWrite(inMetafilePtr,
  8277.             ((MF3DMacintoshPathObjPtr)inObj)->pathName);
  8278. }
  8279.  
  8280. /*==============================================================================
  8281.  *    MF3D_ObjMacintoshPathDisposer
  8282.  *==============================================================================
  8283.  */
  8284. MF3DErr
  8285. MF3D_ObjMacintoshPathDisposer(
  8286.     MF3DVoidObjPtr    inObj)
  8287. {
  8288.     MF3D_VerifyObjectType(inObj, kMF3DObjMacintoshPath);
  8289.  
  8290.     if (inObj != NULL)
  8291.     {    MF3D_Free(((MF3DMacintoshPathObjPtr)inObj)->pathName);
  8292.         MF3D_Free(inObj);
  8293.     }
  8294.     return kMF3DNoErr;
  8295. }
  8296.  
  8297. /*==============================================================================
  8298.  *    MF3D_ObjUnixPathReader
  8299.  *==============================================================================
  8300.  */
  8301. MF3DErr
  8302. MF3D_ObjUnixPathReader(
  8303.     MF3D_FilePtr    inMetafilePtr,
  8304.     MF3DVoidObjPtr    *outObj)
  8305. {
  8306.     MF3DUnixPathObjPtr            returnObj;
  8307.     MF3DErr                        result;
  8308.  
  8309.     result = kMF3DNoErr;
  8310.  
  8311.     MF3D_Allocate(returnObj);
  8312.  
  8313.     if (result == kMF3DNoErr)
  8314.         result = MF3D_CStringRead(inMetafilePtr, &returnObj->pathName);
  8315.  
  8316.     if (result == kMF3DNoErr)
  8317.         *outObj = (MF3DVoidObjPtr) returnObj;
  8318.     else
  8319.         MF3D_Free(returnObj);
  8320.  
  8321.     return result;
  8322. }
  8323.  
  8324. /*==============================================================================
  8325.  *    MF3D_ObjUnixPathWriter
  8326.  *==============================================================================
  8327.  */
  8328. MF3DErr
  8329. MF3D_ObjUnixPathWriter(
  8330.     MF3D_FilePtr    inMetafilePtr,
  8331.     MF3DVoidObjPtr    inObj)
  8332. {
  8333.     MF3D_VerifyObjectType(inObj, kMF3DObjUnixPath);
  8334.     return MF3D_CStringWrite(inMetafilePtr,
  8335.             ((MF3DUnixPathObjPtr)inObj)->pathName);
  8336. }
  8337.  
  8338. /*==============================================================================
  8339.  *    MF3D_ObjUnixPathDisposer
  8340.  *==============================================================================
  8341.  */
  8342. MF3DErr
  8343. MF3D_ObjUnixPathDisposer(
  8344.     MF3DVoidObjPtr    inObj)
  8345. {
  8346.     MF3D_VerifyObjectType(inObj, kMF3DObjUnixPath);
  8347.  
  8348.     if (inObj != NULL)
  8349.     {    MF3D_Free(((MF3DUnixPathObjPtr)inObj)->pathName);
  8350.         MF3D_Free(inObj);
  8351.     }
  8352.     return kMF3DNoErr;
  8353. }
  8354.  
  8355. /*==============================================================================
  8356.  *    MF3D_ObjCStringReader
  8357.  *==============================================================================
  8358.  */
  8359. MF3DErr
  8360. MF3D_ObjCStringReader(
  8361.     MF3D_FilePtr    inMetafilePtr,
  8362.     MF3DVoidObjPtr    *outObj)
  8363. {
  8364.     MF3DCStringObjPtr            returnObj;
  8365.     MF3DErr                        result;
  8366.  
  8367.     result = kMF3DNoErr;
  8368.  
  8369.     MF3D_Allocate(returnObj);
  8370.  
  8371.     if (result == kMF3DNoErr)
  8372.         result = MF3D_CStringRead(inMetafilePtr, &returnObj->cString);
  8373.  
  8374.     if (result == kMF3DNoErr)
  8375.         *outObj = (MF3DVoidObjPtr) returnObj;
  8376.     else
  8377.         MF3D_Free(returnObj);
  8378.  
  8379.     return result;
  8380. }
  8381.  
  8382. /*==============================================================================
  8383.  *    MF3D_ObjCStringWriter
  8384.  *==============================================================================
  8385.  */
  8386. MF3DErr
  8387. MF3D_ObjCStringWriter(
  8388.     MF3D_FilePtr    inMetafilePtr,
  8389.     MF3DVoidObjPtr    inObj)
  8390. {
  8391.     MF3D_VerifyObjectType(inObj, kMF3DObjCString);
  8392.     return MF3D_CStringWrite(inMetafilePtr,
  8393.             ((MF3DCStringObjPtr)inObj)->cString);
  8394. }
  8395.  
  8396. /*==============================================================================
  8397.  *    MF3D_ObjCStringDisposer
  8398.  *==============================================================================
  8399.  */
  8400. MF3DErr
  8401. MF3D_ObjCStringDisposer(
  8402.     MF3DVoidObjPtr    inObj)
  8403. {
  8404.     MF3D_VerifyObjectType(inObj, kMF3DObjCString);
  8405.  
  8406.     if (inObj != NULL)
  8407.     {    MF3D_Free(((MF3DCStringObjPtr)inObj)->cString);
  8408.         MF3D_Free(inObj);
  8409.     }
  8410.     return kMF3DNoErr;
  8411. }
  8412.  
  8413. /*==============================================================================
  8414.  *    MF3D_ObjUnicodeReader
  8415.  *==============================================================================
  8416.  */
  8417. MF3DErr
  8418. MF3D_ObjUnicodeReader(
  8419.     MF3D_FilePtr    inMetafilePtr,
  8420.     MF3DVoidObjPtr    *outObj)
  8421. {
  8422.     MF3DUnicodeObjPtr            returnObj;
  8423.     MF3DUns32                    rawDataSize;
  8424.     MF3DErr                        result;
  8425.  
  8426.     result = kMF3DNoErr;
  8427.  
  8428.     MF3D_Allocate(returnObj);
  8429.  
  8430.     if (result == kMF3DNoErr)
  8431.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->length);
  8432.  
  8433.     if (result == kMF3DNoErr)
  8434.     {    rawDataSize = returnObj->length;
  8435.         if (rawDataSize == 0)
  8436.         {    returnObj->unicode = NULL;
  8437.         }
  8438.         else
  8439.         {    returnObj->unicode = MF3D_Malloc(rawDataSize);
  8440.             if (returnObj->unicode == NULL)
  8441.                 result = kMF3DErrOutOfMemory;
  8442.         }
  8443.     }
  8444.  
  8445.     if (result == kMF3DNoErr)
  8446.     {    result = MF3D_RawDataRead(inMetafilePtr, rawDataSize,
  8447.                 returnObj->unicode);
  8448.         if (result != kMF3DNoErr)
  8449.             MF3D_Free(returnObj->unicode);
  8450.     }
  8451.  
  8452.     if (result == kMF3DNoErr)
  8453.         *outObj = (MF3DVoidObjPtr) returnObj;
  8454.     else
  8455.         MF3D_Free(returnObj);
  8456.  
  8457.     return result;
  8458. }
  8459.  
  8460. /*==============================================================================
  8461.  *    MF3D_ObjUnicodeWriter
  8462.  *==============================================================================
  8463.  */
  8464. MF3DErr
  8465. MF3D_ObjUnicodeWriter(
  8466.     MF3D_FilePtr    inMetafilePtr,
  8467.     MF3DVoidObjPtr    inObj)
  8468. {
  8469.     MF3DUnicodeObjPtr            writeObj;
  8470.     MF3DErr                        result;
  8471.  
  8472.     MF3D_VerifyObjectType(inObj, kMF3DObjUnicode);
  8473.     writeObj = (MF3DUnicodeObjPtr)inObj;
  8474.  
  8475.     result = kMF3DNoErr;
  8476.  
  8477.     if (writeObj->unicode != NULL)
  8478.     {    MF3D_WriteNewLine(inMetafilePtr);
  8479.         result = MF3D_Uns32Write(inMetafilePtr, writeObj->length);
  8480.  
  8481.         if (result == kMF3DNoErr)
  8482.         {    result = MF3D_RawDataWrite(inMetafilePtr, writeObj->length,
  8483.                     writeObj->unicode);
  8484.         }
  8485.     }
  8486.  
  8487.     return result;
  8488. }
  8489.  
  8490. /*==============================================================================
  8491.  *    MF3D_ObjUnicodeDisposer
  8492.  *==============================================================================
  8493.  */
  8494. MF3DErr
  8495. MF3D_ObjUnicodeDisposer(
  8496.     MF3DVoidObjPtr    inObj)
  8497. {
  8498.     MF3D_VerifyObjectType(inObj, kMF3DObjUnicode);
  8499.  
  8500.     if (inObj != NULL)
  8501.     {    MF3D_Free(((MF3DUnicodeObjPtr)inObj)->unicode);
  8502.         MF3D_Free(inObj);
  8503.     }
  8504.     return kMF3DNoErr;
  8505. }
  8506.  
  8507. /*==============================================================================
  8508.  *    MF3D_ObjPixmapTextureReader
  8509.  *==============================================================================
  8510.  */
  8511. MF3DErr
  8512. MF3D_ObjPixmapTextureReader(
  8513.     MF3D_FilePtr    inMetafilePtr,
  8514.     MF3DVoidObjPtr    *outObj)
  8515. {
  8516.     MF3DPixmapTextureObjPtr        returnObj;
  8517.     MF3DUns32                    imageSize;
  8518.     MF3DErr                        result;
  8519.  
  8520.     result = kMF3DNoErr;
  8521.  
  8522.     MF3D_Allocate(returnObj);
  8523.  
  8524.     if (result == kMF3DNoErr)
  8525.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->width);
  8526.  
  8527.     if (result == kMF3DNoErr)
  8528.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->height);
  8529.  
  8530.     if (result == kMF3DNoErr)
  8531.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->rowBytes);
  8532.  
  8533.     if (result == kMF3DNoErr)
  8534.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->pixelSize);
  8535.  
  8536.     if (result == kMF3DNoErr)
  8537.     {    result = MF3D_EnumRead(inMetafilePtr, gMF3D_PixelTypeEnum,
  8538.                 &returnObj->pixelType);
  8539.     }
  8540.  
  8541.     if (result == kMF3DNoErr)
  8542.     {    result = MF3D_EnumRead(inMetafilePtr, gMF3D_EndianEnum,
  8543.                 &returnObj->bitOrder);
  8544.     }
  8545.  
  8546.     if (result == kMF3DNoErr)
  8547.     {    result = MF3D_EnumRead(inMetafilePtr, gMF3D_EndianEnum,
  8548.                 &returnObj->byteOrder);
  8549.     }
  8550.  
  8551.     if (result == kMF3DNoErr)
  8552.     {    imageSize = returnObj->rowBytes * returnObj->height;
  8553.         if (imageSize == 0)
  8554.             result = kMF3DErrWidthOrHeightIsZero;
  8555.     }
  8556.  
  8557.     if (result == kMF3DNoErr)
  8558.     {    returnObj->image = MF3D_Malloc(imageSize);
  8559.         if (returnObj->image == NULL)
  8560.             result = kMF3DErrOutOfMemory;
  8561.     }
  8562.  
  8563.     if (result == kMF3DNoErr)
  8564.     {    result = MF3D_RawDataRead(inMetafilePtr, imageSize, returnObj->image);
  8565.         if (result != kMF3DNoErr)
  8566.             MF3D_Free(returnObj->image);
  8567.     }
  8568.  
  8569.     if (result == kMF3DNoErr)
  8570.         *outObj = (MF3DVoidObjPtr) returnObj;
  8571.     else
  8572.         MF3D_Free(returnObj);
  8573.  
  8574.     return result;
  8575. }
  8576.  
  8577. /*==============================================================================
  8578.  *    MF3D_ObjPixmapTextureWriter
  8579.  *==============================================================================
  8580.  */
  8581. MF3DErr
  8582. MF3D_ObjPixmapTextureWriter(
  8583.     MF3D_FilePtr    inMetafilePtr,
  8584.     MF3DVoidObjPtr    inObj)
  8585. {
  8586.     MF3DPixmapTextureObjPtr        writeObj;
  8587.     MF3DUns32                    imageSize;
  8588.     MF3DErr                        result;
  8589.  
  8590.     MF3D_VerifyObjectType(inObj, kMF3DObjPixmapTexture);
  8591.     writeObj = (MF3DPixmapTextureObjPtr)inObj;
  8592.  
  8593.     result = kMF3DNoErr;
  8594.  
  8595.     imageSize = writeObj->rowBytes * writeObj->height;
  8596.     if (imageSize == 0)
  8597.         result = kMF3DErrWidthOrHeightIsZero;
  8598.  
  8599.     if (result == kMF3DNoErr)
  8600.     {    MF3D_WriteNewLine(inMetafilePtr);
  8601.         result = MF3D_Uns32Write(inMetafilePtr, writeObj->width);
  8602.     }
  8603.  
  8604.     if (result == kMF3DNoErr)
  8605.         result = MF3D_Uns32Write(inMetafilePtr, writeObj->height);
  8606.  
  8607.     if (result == kMF3DNoErr)
  8608.         result = MF3D_Uns32Write(inMetafilePtr, writeObj->rowBytes);
  8609.  
  8610.     if (result == kMF3DNoErr)
  8611.     {    MF3D_WriteNewLine(inMetafilePtr);
  8612.         result = MF3D_Uns32Write(inMetafilePtr, writeObj->pixelSize);
  8613.     }
  8614.  
  8615.     if (result == kMF3DNoErr)
  8616.     {    result = MF3D_EnumWrite(inMetafilePtr, gMF3D_PixelTypeEnum,
  8617.                 writeObj->pixelType);
  8618.     }
  8619.  
  8620.     if (result == kMF3DNoErr)
  8621.     {    MF3D_WriteNewLine(inMetafilePtr);
  8622.         result = MF3D_EnumWrite(inMetafilePtr, gMF3D_EndianEnum,
  8623.                 writeObj->bitOrder);
  8624.     }
  8625.  
  8626.     if (result == kMF3DNoErr)
  8627.     {    result = MF3D_EnumWrite(inMetafilePtr, gMF3D_EndianEnum,
  8628.                 writeObj->byteOrder);
  8629.     }
  8630.  
  8631.     if (result == kMF3DNoErr)
  8632.     {    result = MF3D_RawDataWrite(inMetafilePtr, imageSize, writeObj->image);
  8633.     }
  8634.  
  8635.     return result;
  8636. }
  8637.  
  8638. /*==============================================================================
  8639.  *    MF3D_ObjPixmapTextureDisposer
  8640.  *==============================================================================
  8641.  */
  8642. MF3DErr
  8643. MF3D_ObjPixmapTextureDisposer(
  8644.     MF3DVoidObjPtr    inObj)
  8645. {
  8646.     MF3D_VerifyObjectType(inObj, kMF3DObjPixmapTexture);
  8647.  
  8648.     if (inObj != NULL)
  8649.     {    MF3D_Free(((MF3DPixmapTextureObjPtr)inObj)->image);
  8650.         MF3D_Free(inObj);
  8651.     }
  8652.     return kMF3DNoErr;
  8653. }
  8654.  
  8655. /*==============================================================================
  8656.  *    MF3D_ObjViewHintsReader
  8657.  *==============================================================================
  8658.  */
  8659. MF3DErr
  8660. MF3D_ObjViewHintsReader(
  8661.     MF3D_FilePtr    inMetafilePtr,
  8662.     MF3DVoidObjPtr    *outObj)
  8663. {
  8664.     MF3DViewHintsObjPtr            returnObj;
  8665.     MF3DErr                        result;
  8666.  
  8667.     MF3D_Unused(inMetafilePtr);
  8668.     result = kMF3DNoErr;
  8669.  
  8670.     MF3D_Allocate(returnObj);
  8671.  
  8672.     if (result == kMF3DNoErr)
  8673.         *outObj = (MF3DVoidObjPtr) returnObj;
  8674.     else
  8675.         MF3D_Free(returnObj);
  8676.  
  8677.     return result;
  8678. }
  8679.  
  8680. /*==============================================================================
  8681.  *    MF3D_ObjViewHintsWriter
  8682.  *==============================================================================
  8683.  */
  8684. MF3DErr
  8685. MF3D_ObjViewHintsWriter(
  8686.     MF3D_FilePtr    inMetafilePtr,
  8687.     MF3DVoidObjPtr    inObj)
  8688. {
  8689.     MF3D_VerifyObjectType(inObj, kMF3DObjViewHints);
  8690.     MF3D_Unused(inMetafilePtr);
  8691.     MF3D_Unused(inObj);
  8692.     /* Nothing to write! */
  8693.     return kMF3DNoErr;
  8694. }
  8695.  
  8696. /*==============================================================================
  8697.  *    MF3D_ObjViewHintsDisposer
  8698.  *==============================================================================
  8699.  */
  8700. MF3DErr
  8701. MF3D_ObjViewHintsDisposer(
  8702.     MF3DVoidObjPtr    inObj)
  8703. {
  8704.     MF3D_VerifyObjectType(inObj, kMF3DObjViewHints);
  8705.  
  8706.     MF3D_Free(inObj);
  8707.     return kMF3DNoErr;
  8708. }
  8709.  
  8710. /*==============================================================================
  8711.  *    MF3D_ObjUnknownReader
  8712.  *==============================================================================
  8713.  */
  8714. MF3DErr
  8715. MF3D_ObjUnknownReader(
  8716.     MF3D_FilePtr    inMetafilePtr,
  8717.     MF3DVoidObjPtr    *outObj)
  8718. {
  8719.     MF3DUnknownObjPtr        returnObj;
  8720.     char                    *bufPtr;
  8721.     MF3DUns32                bufferEnd;
  8722.     MF3DUns32                bufPos;
  8723.     MF3DErr                    result;
  8724.  
  8725.     result = kMF3DNoErr;
  8726.  
  8727.     MF3D_Allocate(returnObj);
  8728.  
  8729.     if (result == kMF3DNoErr)
  8730.     {    returnObj->dataFormat = inMetafilePtr->dataFormat;
  8731.  
  8732.         bufPtr = inMetafilePtr->readBuffer.buf;
  8733.         bufPos = inMetafilePtr->readBuffer.bufPos;
  8734.         bufferEnd = inMetafilePtr->readBuffer.bufSize;
  8735.  
  8736.         if (MF3DIsTextFormat(inMetafilePtr->dataFormat))
  8737.         {    /* Do not include trailing ')' in text files */
  8738.             do { } while (bufPtr[--bufferEnd] != kMF3D_EndChar);
  8739.         }
  8740.  
  8741.         returnObj->size = bufferEnd - bufPos;
  8742.  
  8743.         inMetafilePtr->readBuffer.bufPos = bufferEnd;
  8744.  
  8745.         if (returnObj->size == 0)
  8746.             returnObj->data = NULL;
  8747.         else
  8748.         {    returnObj->data = MF3D_Malloc(returnObj->size);
  8749.             if (returnObj->data == NULL)
  8750.                 result = kMF3DErrOutOfMemory;
  8751.         }
  8752.     }
  8753.  
  8754.     /* Copy the contents, whatever they may be */
  8755.     if (result == kMF3DNoErr)
  8756.     {    memcpy(returnObj->data, &bufPtr[bufPos], returnObj->size);
  8757.     }
  8758.  
  8759.     if (result == kMF3DNoErr)
  8760.         *outObj = (MF3DVoidObjPtr) returnObj;
  8761.     else
  8762.         MF3D_Free(returnObj);
  8763.  
  8764.     return result;
  8765. }
  8766.  
  8767. /*==============================================================================
  8768.  *    MF3D_ObjUnknownWriter
  8769.  *==============================================================================
  8770.  */
  8771. MF3DErr
  8772. MF3D_ObjUnknownWriter(
  8773.     MF3D_FilePtr    inMetafilePtr,
  8774.     MF3DVoidObjPtr    inObj)
  8775. {
  8776.     MF3DUnknownObjPtr        writeObj;
  8777.     MF3DErr                    result;
  8778.  
  8779.     MF3D_VerifyObjectType(inObj, kMF3DObjUnknownType);
  8780.     writeObj = (MF3DUnknownObjPtr)inObj;
  8781.  
  8782.     MF3D_WriteNewLine(inMetafilePtr);
  8783.     result = MF3D_WriteProc(inMetafilePtr, writeObj->size, writeObj->data);
  8784.  
  8785.     if (inMetafilePtr->dataFormat != writeObj->dataFormat)
  8786.         result = kMF3DWarnWrongUnknownTypeFormat;
  8787.  
  8788.     return result;
  8789. }
  8790.  
  8791. /*==============================================================================
  8792.  *    MF3D_ObjUnknownDisposer
  8793.  *==============================================================================
  8794.  */
  8795. MF3DErr
  8796. MF3D_ObjUnknownDisposer(
  8797.     MF3DVoidObjPtr    inObj)
  8798. {
  8799.     MF3D_VerifyObjectType(inObj, kMF3DObjUnknownType);
  8800.  
  8801.     if (inObj != NULL)
  8802.     {    MF3D_Free(((MF3DUnknownObjPtr)inObj)->realObjectName);
  8803.         MF3D_Free(((MF3DUnknownObjPtr)inObj)->data);
  8804.         MF3D_Free(inObj);
  8805.     }
  8806.     return kMF3DNoErr;
  8807. }
  8808.